memcpy not-POD对象导致未定义的行为

时间:2013-02-21 10:13:25

标签: c++ memcpy pod

在什么情况下,Class的对象会保证将invisible data插入到对象中?

人们通常说使用memcpy复制对象而不是copy-assignment时不行,有时编译器会将不可见数据插入到对象中。所以在memcpy之后,对象内存布局可能会崩溃。

如果它包含虚拟功能,那么它不是POD。 但是包含虚拟,功能可能不会崩溃,它没有定义。 有人可以给我任何关于memcpy肯定是错误的例子。

有些人说shared_ptr影响memcpy,我试过,但它没有崩溃

有人可以写一个测试演示来证明吗?

1 个答案:

答案 0 :(得分:3)

shared_ptr是一个很好的例子:复制对象表示将为您提供指向同一对象的第二个指针,但不会增加使用计数。一旦你打破了使用计数必须等于指针数量的不变量,你就会对未定义的行为开放,例如解除引用悬空指针,并删除两次相同的对象:

shared_ptr<int> good(new int(42));
shared_ptr<int> evil;

memcpy(&evil, &good, sizeof evil); // Breaking invariant
good.reset();                      // Deletes object

*evil = 666;                       // BOOM! accesses deleted object
evil.reset();                      // BOOM! deletes object a second time.

您还提到虚拟功能。如果复制派生类的基础子对象,这些可能会导致问题;结果对象将(可能)指向错误类的虚拟表:

struct Base {
    virtual int f() {return 0;}
};

struct Derived : Base {
    int x;
    virtual int f() {return x;}
};

Base * good = new Derived;
Base evil;

memcpy(*evil, good, sizeof evil); // Base object with Derived vtable (probably)

evil->f(); // BOOM! probably accesses nonexistent member `x`