当构造函数引发异常时,如何在构造函数中分配内存
How is memory allocated in constructor released when the constructor throws an exception?
以下是我的示例代码。基类的指针是使用新操作员从Heap分配的内存。我明确地抛出了例外。由于我没有在 *ptr上调用DELETE,因此未发布新的内存。由于该对象不是完全构造的,我们如何发布内存?
#include <iostream>
using namespace std;
class A
{
public:
A()
{
cout<<"A::ctor"<<endl;
}
~A()
{
cout<<"A::Dctor"<<endl;
}
};
class Base
{
public:
A *ptr;
Base()
{
ptr = new A();
cout<<"Base::Ctor"<<endl;
throw std::exception();
}
~Base()
{
delete ptr;
cout<<"Base::Dtor"<<endl;
}
};
int main()
{
try{
Base bobj;
}
catch(exception e)
{
cout<<e.what();
}
return 0;
}
当基础构造器引发异常时,控件会捕获块并处理异常。但是ptr = new A();
分配的内存是如何发布的?
现在,我知道使用智能指针可以解决这个问题。但是在C 11之前如何处理此类情况。
此外,我想知道如何关闭文件处理程序的文件处理程序,在构造函数和构造函数中开放了一个例外?
Base()
{
ofstream myfile;
myfile.open("myfile.txt");
..........
throw std::exception();
}
~Base()
{
myfile.close();
}
与ptr
关联的内存永远不会发布!
是的,这总是一个问题。
在C 11之前,您可以构建自己的智能指针类(例如,在Boost中使用),或者在抛出异常之前请注意delete
。将ptr
放在基类中也是一种替代方法:基类构造函数将在达到派生的构造函数正文之前完成。
相关文章:
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 具有自定义构造函数 (C++) 的类型的动态数组分配
- C 字符串在显式构造函数中分配值C++?
- 如何为 std::vector 分配内存,然后稍后为某些元素调用构造函数?
- 在构造函数中分配内存失败是如何冒泡的
- 当我尝试通过构造函数分配 char 数组时出现错误
- 如何使用函数(而不是构造函数)将派生类对象分配给基类指针
- 当设置对象等于另一个函数的返回值时,为什么要调用移动构造函数/分配
- 如何安全地释放构造函数分配的资源
- 是否可以在基类中删除复制和移动构造函数/分配运算符
- 如何在隐式复制构造函数/分配运算符中压制成员
- 使用超载构造函数分配
- 使用构造函数分配内存
- 如何使用复杂构造函数分配对象
- 将类构造函数分配给具有参数的新构造函数C++
- 在构造函数分配后更改vtable内存
- 在尝试使用 new 和 copy 构造函数分配内存时,在 '(' 令牌之前获取"预期的非限定 id"
- 为存储库构造函数分配内存
- 由c++中的双默认构造函数分配的值
- 将派生类构造函数分配给基类指针