c++ - 我应该在包含虚方法的类上使用 'memcpy' 吗?如果不是,如何替换它?

标签 c++ serialization deserialization 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,您有两个主要选择:

  • 创建“手动”形成或解释字节数组的自定义序列化和反序列化函数。或者,如果数据大小无关紧要,则将数据转换为字符串,变量之间有一些分隔符。
  • 将所有需要序列化的成员放在一个没有虚函数的简单结构中,并使这样的结构成为类的成员。
  • 关于c++ - 我应该在包含虚方法的类上使用 'memcpy' 吗?如果不是,如何替换它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59047606/

    相关文章:

    c++ - 字符串在转换为 char* C++ 时被截断

    c++ - typedef 模板参数成员函数的返回类型

    c++ - 如何在 C++ 中对 string[] 进行排序

    c# - 反序列化数组中的项目时忽略自定义 JsonConverter

    Ruby 反序列化 YAML

    c++ - 指针或堆对象的二维数组

    java - 包含根值的 Gson 序列化 POJO?

    c# - C# 可以反序列化一个序列化的简单 java 对象吗?

    ruby-on-rails - 在ActiveModel::Serializer中序列化错误哈希

    c# - 无法反序列化惰性对象