如何在向量中释放对象指针?

4 c++ vector

我有 ;

class object {
                    // any private datas token in heap area 
             public : 
                   ~object () ; 

};
Run Code Online (Sandbox Code Playgroud)

在功能;

 vector < object*> tmp ;
Run Code Online (Sandbox Code Playgroud)

我的问题是;

  • 如何擦除/解除分配tmp [i]?换句话说,我应该在object :: destructor中写什么?

Tyl*_*nry 17

你似乎有点困惑.这里有两个概念:

  • 我如何,所有者tmp,解除指针内引用的对象tmp
  • objectclass(~object)的析构函数应该做什么?

这些并不是那么相关.完成tmp向量后,必须手动遍历并调用delete其每个元素,以释放object元素指向的对象占用的内存.当然,这是假设元素被分配new的.

object析构函数的目的~object是释放object对象拥有的所有内容,而不是释放object对象本身.如果object对象不拥有任何动态分配的数据,则不需要执行任何操作.

换句话说,当你写作时delete tmp[i],会发生两件事:

  1. *(tmp[i])::~object() 叫做
  2. 指向的内存tmp[i]被释放

注意,即使(1)绝对没有,也会发生(2).步骤(1)的要点是允许即将被解除分配的对象解除分配需要被解除分配的任何成员对象.析构函数的工作重点是释放调用它的对象.

通过明确的例子:

class object {
  private:
    int foo;
  public:
    object() : foo(42) {}
    ~object() { /* nothing to do here; foo is not dynamically allocated */ }
};

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 and deallocates *tmp[i]
  }
  tmp.clear();

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

或者,相反

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;
}
Run Code Online (Sandbox Code Playgroud)