如果在构造函数中发生异常,如何释放动态内存
How to free dynamic memory if exception occurs in constructor?
i遇到了一种构造函数分配动态内存的情况,如果构造函数中发生任何例外,则没有释放动态分配的内存。为了避免这种情况,我使用了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
不是指针本身。相关的是,如果构造函数中有例外,则也不会调用破坏者。
相关文章:
- 释放错误后堆使用
- G锁定铸造到基础上会释放模拟行为
- 在将变量声明为引用时,堆在释放后使用
- 在调用FreeLibrary后,释放动态链接到具有相同版本的CRT堆的DLL的内存
- 正在理解智能指针,但出现错误:未分配正在释放的指针
- C++双重释放或损坏(out)
- 如何在c++中释放内存
- 使用全局声明的向量时,C++双重释放错误/损坏
- 为什么这个 std::queue/指向结构的指针列表直到 List.Size() == 0 才释放内存?
- 为什么瓦尔格林德在不释放恶意内存后没有报告任何问题?
- 调用析构函数以释放动态分配的内存
- 在函数范围内在堆栈上分配的数组在离开函数时是否总是被释放?
- COM :是否可以查看是否存在对我的某个 COM 对象的进程外引用?我可以释放它吗?
- 如何在向量中释放指针?
- std::unordered_map析构函数不释放内存?
- 在C++中释放内存期间,迭代器与指针有何不同
- 包含矢量指针的结构的内存释放问题
- C++:在被本地字符串捕获后释放或销毁 malloc'd char *?
- 错误:malloc:对象 0x7f9edf504080 的 *** 错误:未分配正在释放的指针
- 如果分配数组引发异常,是否应该释放该数组