c++ - 我应该在包含虚方法的类上使用'memcpy'吗?如果不是,如何替换它?
问题描述
这是我的简化代码,
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 并不安全,但为什么代码在这里工作?我可以用更好的解决方案代替它吗?
解决方案
实际给出答案:为了避免 memcopy,您有两个主要选择:
创建“手动”形成或解释字节数组的自定义序列化和反序列化函数。或者,如果数据大小无关紧要,则将数据转换为字符串,变量之间有一些分隔符。
将所有需要序列化的成员放在一个没有虚函数的简单结构中,并使这样的结构成为类的成员。
推荐阅读
- javascript - 如何在循环内将变量传递给 ajax.done()?
- excel - 在一列中查找多个关键字,如果找到,返回4列
- node.js - 为什么从数据库中获取不同帖子的数据给我第一次发布的结果
- python - 如何在图像角落设置坐标?
- html - 双routerlink,但不知道它来自哪里
- javascript - 10 秒后使用 javascript 和表单提交重定向到另一个页面
- r - 用 dplyr::group_split 和 purrr::map_df 替换 dplyr::do 函数
- c# - 查询 documentdb 中的子字段
- java - 注册和跟踪会员信息
- javascript - 数据表 columndef 渲染没有被击中并且没有错误