在已销毁对象的存储中使用当前对象是否安全?

Pet*_*her 6 c++ constructor lifetime language-lawyer

在此代码示例中,使用放置 new 在另一个对象的存储中创建一个对象,并且永远不会访问释放的内存。

以下是事件的顺序:

  1. 新的 Object1 在分配的内存中创建。Object2 是一个联合体,因此不会被触及。
  2. 使用placement new 在Object1 内部创建Object2
  3. 对象 1 被破坏。对象 2 未受影响。
  4. 打印object2的内容
  5. 调用 Object2 析构函数
  6. Object1 的内存已删除

这安全吗?

#include <stdio.h>
#include <new>

struct Object2
{
    char a{1};
    char b{2};
    char c{3};
};

struct Object1
{
    //
    // disconnect Object2 lifetime from Object1
    //
    
    union
    {
        Object2 o;
    };

    char d{3};

    Object1()
    {
    }
};

int main(int argc, char* argv[])
{
    //
    // Create object1, internal object2 is not yet constructed
    //
    
    Object1* object1 = new Object1();

    //
    // create object2 inside object1 using placement new
    //

    new (&object1->o) Object2();

    Object2* object2 = &object1->o;

    //
    // Destroy object1, but do not free memory, and do not touch object2
    //

    object1->~Object1();

    //
    // Access alive object2 inside object2's memory
    //

    printf("a,b,c=(%d,%d,%d)\n", object2->a, object2->b, object2->c);

    //
    // Destroy object2
    //

    object2->~Object2();
    
    //
    // Destructor has already been called, so safe to delete delete memory without calling destructor
    //

    operator delete(object1);
}
Run Code Online (Sandbox Code Playgroud)