gpt4 book ai didi

c++ - 当我们开始覆盖内存时,对象的生命周期已经结束了吗?

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:43:03 26 4
gpt4 key购买 nike

我无法自行解决以下问题:

假设我们正在以下列方式重用内存:

struct A 
{
int a;
A(){ }
~A(){ }
};

struct B : A
{
int b;
B(){ }
~B(){ }
};

A *a = (A*) malloc(sizeof(A) + sizeof(B));
B *b = new (a) B; //Constructor of B is calling

a 引用的对象的生命周期|在 B 的构造函数之前结束当 B 的构造函数开始调用或结束时已完成?

最佳答案

您尝试使用放置 new 运算符来初始化 b。这个操作符不是先调用类A的析构函数(a),而是在a指向的内存中初始化一个新的。这是有问题的(如评论中所述),因为 sizeof(B) 大于 sizeof(A) 而您只分配了 sizeof(A) 在指针 a 处。所以这是未定义的行为。

a 对象的生命周期并没有正式结束。你会得到类似的东西:

class A { int a; };
void* p = malloc(sizeof(A));
A* a1 = new (p) A();
A* a2 = new (p) A();

我认为,您会在同一内存上得到类似 double called destructor 的东西,但这是特定于编译器实现的东西。我不认为该标准对此有任何说明。

关于c++ - 当我们开始覆盖内存时,对象的生命周期已经结束了吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25717641/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com