最后尝试如何释放记忆

时间:2015-06-21 19:28:46

标签: c++

我是VS C ++中的C ++新手。我正在创建win32 dll库。尝试finally块我有一个重大的基本问题。

让我假装我有这样的事情:

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;
}

我复制了以下代码段: Another stackoverflow question

在上面的例子中,我如何使用“free”部分,以便在方法完成其工作时可以随时释放它?我认为最后尝试应该就够了。

但是现在我可以看到有几个:尝试,__ try不知道有什么区别。使用__try,我得到编译器错误,其中提到了有关RAII的内容......

有人可以帮我吗?

2 个答案:

答案 0 :(得分:5)

它是Resource Acquisition Is Initialization,简称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如果你复制它,两次)。另请参阅Rule of Zero

答案 1 :(得分:1)

有各种各样的方式。

一个是让vector<unique_pointer<object> >成为vector<object *>。根本不需要显式释放对象。

另一种方法是将{{1}}放置为管理释放的另一个类的成员。因此,当该类的实例被销毁时,它的析构函数会释放代码中向量的所有元素。您需要为该类提供其他构造函数和成员函数,以便管理向量正确添加对象。