c++ - 如果构造函数中发生异常,如何释放动态内存?
问题描述
我遇到了构造函数分配动态内存的情况,如果构造函数中发生任何异常,它并没有释放动态分配的内存。为了避免这种情况,我使用了 unique_ptr,它能够正确释放内存。
为了展示这里的情况,这是一个虚拟代码。
class ExceptionInConstructor
{
unique_ptr<int> a;
public:
ExceptionInConstructor()
{
a = std::unique_ptr<int>( new int(10));
cout <<"Constructor called. Value of a is "<< *a<<endl;
//some exception occurs after the mrmory allocation
throw exception();
}
~ExceptionInConstructor()
{
cout << "Dest called()"<<endl;
}
};
int main()
{
try
{
ExceptionInConstructor ex;
}
catch(...)
{}
return 0;
}
对于这种情况,这是一种正确有效的方法,还是对于这种情况有更好的选择?
编辑1:删除了错误留下的析构函数中的注释代码
解决方案
不,这正是智能指针和一般RAII的重点和预期用例。
另请注意,您delete a
的析构函数在任何情况下都是错误的,因为unique_ptr
它本身不是指针。相关地,如果构造函数中存在异常,也不会调用析构函数。
推荐阅读
- oop - 如何在 UML 类图中对非成员聚合建模
- javascript - 元素。删除不起作用。(innerHTML 工作正确)
- python - TypeError:强制转换为 Unicode:需要找到字符串或缓冲区日期时间日期时间
- excel - 使用 excel 宏将订单添加到主库存
- java - 带接口的 Spring 目录结构(最佳实践)
- ios - 呼叫未连接时如何关闭 Callkit UI
- html - 从带有 uBlock Origin 的标签中删除属性
- python - 为什么在尝试过滤索引数据时收到无效令牌?
- angular - 如何为非 li 元素申请 ngfor?
- gradle - 运行 Bobcat 2.X 项目时的警告