Pet*_*her 6 c++ constructor lifetime language-lawyer
在此代码示例中,使用放置 new 在另一个对象的存储中创建一个对象,并且永远不会访问释放的内存。
以下是事件的顺序:
这安全吗?
#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)