如何确保(像try-finally一样)销毁heap分配的对象
How to ensure (like a try-finally) destruction of a HEAP-ALLOCATED object
我正在寻找一种方法来确保在堆上执行的对象在我完成它时总是被释放。
我知道如果它是在堆栈上分配的,我可以使用RAII来确保它会被照顾-不幸的是,这对我来说不起作用(至少直接),因为有问题的对象实际上是通过调用api函数创建的,然后返回一个指向它在堆上创建的对象的指针。
所以,从概念上讲,我想做的是:TheApi::ApiObject* p_myObj = TheApi::createAnApiObj();
try
{
doStuffWithMyObjThatMayError(p_myObj);
}
finally
{
delete p_myObj;
}
我唯一能想到的就是创建一些虚拟的清理类,并在堆栈上创建一个实例:
class MegaMaid
{
private:
TheApi::ApiObject* toFree;
public:
MegaMaid(TheApi::ApiObject* toFree)
{
this->toFree = toFree;
}
~MegaMaid()
{
delete toFree;
}
};
void doStuff()
{
TheApi::ApiObject* p_myObj = TheApi::createAnApiObj();
TheApi::ApiObject* p_myObj;
MegaMaid cleaner(p_myObj);
doStuffWithMyObjThatMayError(p_myObj);
}
有更好的方法来完成这个吗?或者这是公认的解决方案?
您仍然可以对函数返回的指针使用RAII。您可以像这样使用智能指针(这正是您所描述的虚拟类):
std::unique_ptr<TheApi::ApiObject> p_myObj(TheApi::createAnApiObj());
这个"哑类"被称为"智能指针"。你应该检查std::auto_ptr
或boost::shared_ptr
。
相关文章:
- std::threads可以从Windows DLL中的全局变量创建/销毁吗?
- 派生类销毁的最佳实践是什么
- 当一个新对象被分配到它的地址时,对象是否必须被销毁
- 在以唯一ptr为值的C++映射中,动态内存何时会被销毁
- 为什么我的 heap.h 文件给我一个LNK2001错误?
- WinAPI 在单击第一个对话框上的按钮控件并销毁第一个对话框后创建第二个对话框
- 如何在调用析构函数时优雅地停止/销毁带有阻塞调用C++线程?
- C++:在被本地字符串捕获后释放或销毁 malloc'd char *?
- 如何在不销毁对象的情况下返回对象列表
- C++:处理线程本地对象销毁
- 将通用对象传递给 Rust 并在使用后传递回 C++ 进行销毁
- C++对象的创建和销毁
- 当为可变性配置时,boost::heap::d_ary_heap 保留的额外 std::list 的目的是什么?
- c++ 何时/为什么由值构造/销毁捕获变量
- 了解 Linux 虚拟内存:valgrind 的 massif 输出显示了有和没有 --pages-as-heap 的主要差异
- 销毁C++中动态分配的内存(数组对象)
- 正确初始化和销毁对象指针的C++数组?
- C++在一个映射中存储不同的指针类型(并处理销毁)
- Winapi - SetWindowLongPtr in ShutdownBlockReason创建/销毁JNI本机代码
- 如何确保(像try-finally一样)销毁heap分配的对象