最后尝试如何释放内存

try finally how to free memory

本文关键字:释放 内存 何释放 最后      更新时间:2023-10-16

我是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 *>放置为管理释放的另一个类的成员。 因此,当该类的实例被销毁时,其析构函数会释放代码中向量的所有元素。 您需要为该类提供其他构造函数和成员函数,以正确管理向量添加对象。