在什么情况下,Class的对象会保证将invisible data
插入到对象中?
人们通常说使用memcpy
复制对象而不是copy-assignment
时不行,有时编译器会将不可见数据插入到对象中。所以在memcpy
之后,对象内存布局可能会崩溃。
如果它包含虚拟功能,那么它不是POD。 但是包含虚拟,功能可能不会崩溃,它没有定义。 有人可以给我任何关于memcpy肯定是错误的例子。
有些人说shared_ptr
影响memcpy
,我试过,但它没有崩溃
有人可以写一个测试演示来证明吗?
答案 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`