我应该在包含虚方法的class上使用'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;
}
这段代码试图从文件中反序列化一些 class,并且运行良好。但是 CPP-rules-checking-system 一直抱怨 Using 'memcpy' on class that contains a virtual method.
我想知道 memcpy 在这里做了什么。也许在虚拟 class 上使用 memcpy 并不安全,但为什么代码在这里有效?我可以用更好的解决方案代替它吗?
实际给出答案:为了避免memcopy,你有两个主要选择:
创建形成或解释字节数组的自定义序列化和反序列化函数 "manually"。或者,如果数据大小不太重要,请将数据转换为变量之间带有分隔符的字符串。
将所有需要序列化的成员放在一个没有虚函数的简单结构中,并制作这样一个结构,成为您的类.
的成员
这是我的简化代码,
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;
}
这段代码试图从文件中反序列化一些 class,并且运行良好。但是 CPP-rules-checking-system 一直抱怨 Using 'memcpy' on class that contains a virtual method.
我想知道 memcpy 在这里做了什么。也许在虚拟 class 上使用 memcpy 并不安全,但为什么代码在这里有效?我可以用更好的解决方案代替它吗?
实际给出答案:为了避免memcopy,你有两个主要选择:
创建形成或解释字节数组的自定义序列化和反序列化函数 "manually"。或者,如果数据大小不太重要,请将数据转换为变量之间带有分隔符的字符串。
将所有需要序列化的成员放在一个没有虚函数的简单结构中,并制作这样一个结构,成为您的类.
的成员