我是否应该在包含虚拟方法的类上使用'memcpy'?如果没有,如何替换它?

Should I use 'memcpy' on class that contains a virtual method?If not, how to replace it?

本文关键字:如果没有 是否 何替换 替换 memcpy 方法 虚拟 包含      更新时间:2023-10-16

这是我的简化代码,

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并不安全,但是为什么代码在这里工作?我可以用更好的解决方案代替它吗?

要实际给出答案: 为了避免内存复制,您有两个主要选择:

  1. 创建自定义序列化和反序列化"手动"形成或解释字节数组的函数。或者,如果数据大小不太重要,请将数据转换为字符串,变量之间带有一些分隔符。

  2. 将所有需要序列化的成员放在一个没有虚函数的简单结构中,并使这样的结构成为类的成员。

相关文章: