最后尝试如何释放内存
try finally how to free memory
我是VS C++C++新手。我正在创建 win32 dll 库。我有一个主要的基本问题,尝试最终阻止。
让我们假设我有这样的东西:
class object {
private:
int* foo;
public:
object() : foo(new int()) { *foo = 42; }
~object() {
// Now since foo is dynamically allocated, the destructor
// needs to deallocate it
delete foo;
}
};
int main() {
vector<object*> tmp;
tmp.push_back(new object());
// Do some stuff with tmp
for (int i = 0; i < tmp.size(); ++i) {
delete tmp[i]; // Calls ~object (which deallocates tmp[i]->foo)
// and deallocates *tmp[i]
}
tmp.clear();
return 0;
}
我从以下位置复制了代码片段:另一个堆栈溢出问题
在上面的示例中,如何使用"free"部分,以便在方法完成其工作时始终可以释放它?我想最后尝试就足够了。
但是现在我可以看到有几个:尝试,__try不知道有什么区别。有了__try我得到编译器错误,这说明了一些关于 RAII 的事情......
谁能帮我解决这个问题?
它的资源获取是初始化,简称 RAII。这个想法是,如果一个对象拥有资源,它的析构函数应该自动释放它。在所有这些情况下,对于 C++11,您希望使用std::unique_ptr
而不是原始指针。因此,例如:
class object {
std::unique_ptr<int> foo;
public:
object() : foo(std::make_unique<int>(42)) { }
// no destructor necessary here
};
int main() {
std::vector<std::unique_ptr<object>> tmp;
tmp.push_back(std::make_unique<object>());
// when tmp goes out of scope, each object in it will already
// be deleted for you, no code necessary
}
这里的许多优点之一是,现在您不必担心为object
编写复制构造函数(按原样,如果您复制它,您的foo
将获得两次delete
(。另见零法则
有多种方法。
一是让vector<object *>
成为vector<unique_pointer<object> >
。 根本不需要显式释放对象。
另一种方法是将vector<object *>
放置为管理释放的另一个类的成员。 因此,当该类的实例被销毁时,其析构函数会释放代码中向量的所有元素。 您需要为该类提供其他构造函数和成员函数,以正确管理向量添加对象。
相关文章:
- 如何在c++中释放内存
- 为什么这个 std::queue/指向结构的指针列表直到 List.Size() == 0 才释放内存?
- std::unordered_map析构函数不释放内存?
- 在C++中释放内存期间,迭代器与指针有何不同
- 使用共享指针时,从共享指针本身释放内存的机制是什么
- 释放内存(主题模板)时出现问题
- 使用后自动释放内存
- C++ 如何释放内存
- 从函数内对象的向量中释放内存
- C++ 在不释放内存的情况下调用析构函数
- 多个线程之间的获取-释放内存顺序
- C++ - 析构函数只是释放内存还是实际删除对象
- 使用 RAII 替换最终块以释放内存
- 如何通过带有指向基类的指针的删除运算符释放内存
- 代码中的"sprintf"用法是否需要释放内存?
- C++何时使用 delete[] 并正确释放内存?
- 为什么此获取和释放内存围栏不能给出一致的值?
- 抛出新表达式的参数子表达式时释放内存
- 在这种情况下,如何释放内存?
- 在 c++ 中应按什么顺序释放内存?