我是否应该在包含虚拟方法的类上使用'memcpy'?如果没有,如何替换它?
Should I use 'memcpy' on class that contains a virtual method?If not, how to replace it?
这是我的简化代码,
class ParentDict {
public:
virtual some_func();
virtual reorganize() = 0;
protected:
int _ssize;
int _lsize;
}
class ChildDict : public ParentDict {
public:
virtual some_func();
virtual reorganize(); // deserialize _arrays here;
private:
int _array_num;
char* _arrays;
}
ChildDict* deserialize(void* pool, uint64_t offset) {
void *ptr = (void *)((uint64_t)pool + offset);
ChirdDict dict = *((ChildDict *) ptr);
// HERE is the problem code
memcpy((void *)ptr, &dict, sizeof(ptr));
((ChildDict *) ptr)->reorganize();
return (ChildDict *)ptr;
}
这段代码试图从文件中反序列化某个类,它运行良好。但是CPP规则检查系统一直在抱怨在包含虚拟方法的类上使用"memcpy"。
我想知道memcpy在这里做了什么。也许在虚拟课堂上使用memcpy并不安全,但是为什么代码在这里工作?我可以用更好的解决方案代替它吗?
要实际给出答案: 为了避免内存复制,您有两个主要选择:
-
创建自定义序列化和反序列化"手动"形成或解释字节数组的函数。或者,如果数据大小不太重要,请将数据转换为字符串,变量之间带有一些分隔符。
-
将所有需要序列化的成员放在一个没有虚函数的简单结构中,并使这样的结构成为类的成员。
相关文章:
- 如果没有malloc,链表实现将失败
- 如果没有数学库,我如何在C++中创建复利公式
- 有没有办法在 c++ 中同时生成随机数?如果没有,是否有解决方法?
- 检查数组中是否有字符串中的值,如果没有,则添加它
- 为什么使用 std::vector 的代码不能编译,但使用 std::unique_ptr 如果没有 noexcept
- 如果没有重新散列,为什么 unordered_set::begin() 会改变?
- 包装器是从 strcat_s() 到 strcat() 吗?如果没有,是否可以创建一个?
- 检查私有成员变量是否在一定范围内,如果没有调整
- 我是否应该在包含虚拟方法的类上使用'memcpy'?如果没有,如何替换它?
- 是否可以"unprivate" C++继承中的元素?如果没有怎么办?
- 如果没有带有函数签名的 rvalue 参数,是否会执行 C++ 11 中的移动语义?
- 如何检查传递给函数的容器是否已排序,如果没有,则对其进行排序
- 如何检查是否存在单例实例,如果没有,则不创建新实例?
- 我正在尝试做一个循环,检查输入是否是一个数字,如果没有再次询问
- 如果没有从堆中为字符串文字分配内存,是否安全
- 如果没有头文件,.lib文件是否毫无用处
- 如果没有定义Move语义(Move构造函数和Move赋值操作符),编译器是否默认优化
- 是否有“shared_lock_guard”,如果没有,它会是什么样子?
- C++11是否添加了C99限制说明符?如果没有,为什么不呢
- 是否有可能在C中使用系统api启动一个kill命令?如果没有其他选择的话