gpt4 book ai didi

C++非完全构造的对象释放

转载 作者:太空狗 更新时间:2023-10-29 23:26:37 25 4
gpt4 key购买 nike

代码:

#include<iostream>
using namespace std;
class A{
public:
A(){cout << "A() Constructor " << endl;
throw 1;
}

};


int main(){
A* p=0;
cout << p << endl; // p value is 0
try{
p=new A(); // object is not fully constructed, no address is returned to p. for future deallocation

}
catch(...){cout << "Exception" << endl;}
cout << p << endl; // this will output that p has the value 0,proof that no address was returned to p.


}

在堆中为A对象分配内存,内存的地址传给构造函数但是当构造函数 throw 1; 时,A 类型的对象将不会被视为完全构造的对象。所以不行指针将返回指针 p。如果我理解有误,请随时纠正我。

问题:
1) 所以我的问题是在这种情况下如何为 A 对象释放内存。我不是在谈论调用析构函数,但释放内存。

2) 当我在 main 函数中创建类型为 A 的本地对象时会怎样。显然它也不会完全构建。这个对象什么时候被释放(当然是在调用完全构造的子对象的析构函数之后)。

最佳答案

new A() 完成的分配包括多个步骤:

  1. 使用 operator new(sizeof(A)) 分配内存。
  2. 尝试在分配的内存中默认构造一个对象。
  3. 当默认构造失败时,使用先前获得的地址调用operator delete(x)

更一般地说,如果您使用重载的 operator new(),例如 new(allocator) A() 调用 operator new(size_t, Alloctor )(其中 allocator 可转换为 Allocator),调用相应的 operator delete()

作为异常抛出的一部分,所有部分构造的子对象也被销毁(按照它们构造的相反顺序)。也就是说,如果对象的构造函数抛出异常,则无需关心清理(假设所有子对象都正确地处理了它们分配的资源)。这与对象是分配在堆上还是堆栈上无关。

关于C++非完全构造的对象释放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13001997/

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