【问题标题】:It's right to use memcpy to copy a class object? [duplicate]使用 memcpy 复制一个类对象对吗? [复制]
【发布时间】:2017-10-02 12:25:17
【问题描述】:
class SomeClass
{
public:
    int SomeFunc();
    virtual void DoSomeThing();
    void Copy(MyContainer* container)
    {
        //Is this line OK?
        //why not memcpy(container->data, this, sizeof(SomeClass) ?
        memcpy(&container->data, this, sizeof(SomeClass));
    }

    SomeClass* GetFromCopy(MyContainer* container)
    {
        //And this ?
        return (KLunaBase*)&container->pData;
    }

    void Test()
    {
        MyContainer* cont = NULL;
        container = malloc(sizeof(cont) - sizeof(cont->data) + size);
        Copy(cont);
    }

private:
    int a;
    int b;
    SomeOtherClass objA;
}

struct MyContainer
{
    const void* data;
}

我看过一些历史代码,上面简化了,函数CopyGetFromCopy我看不懂。 我知道 POD 类可以复制,但是如果该类有虚函数和引用成员对象呢?

对不起我的英语不好。

【问题讨论】:

  • ,不,绝对不是。
  • 相关/欺骗:123
  • 警告:重复问题的答案充其量是无益的,最坏的情况是具有误导性。如果SomeClass 可以简单地复制,那么编译器实现的复制构造函数无论如何都会以这种方式工作。使用memcpy 将数组复制为一个块有一些巧妙的技巧,但答案是“使用std::vector 它将在有效的情况下执行此操作(并且在移动情况下更好)”。正确使用类型系统和模板,所有这些决定都会为您有效地做出。
  • 另外,你为什么使用malloc?那是您错过的另一个问题。 malloc 所做的只是分配内存——它不创建对象。停止将 C 的处理方式与 C++ 混合。

标签: c++


【解决方案1】:

不,不要那样做。

提供适当的复制构造函数和赋值运算符,分别使用编译器生成的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-18
    • 2011-05-21
    • 1970-01-01
    • 2019-11-18
    • 2014-11-19
    • 2017-03-21
    • 1970-01-01
    相关资源
    最近更新 更多