为什么不需要手动释放矢量?

Why don't vectors need to be manually freed?

本文关键字:释放 不需要 为什么      更新时间:2023-10-16

我刚刚学习c++,来自对c和Java的理解。我不太明白为什么我写的一些代码没有泄漏内存。下面是代码:

// Foo.h
class Foo {
private:
  std::vector<int> v;
public:
  Foo();
  virtual ~Foo();
  void add_int(int);
}
// Foo.cpp
Foo::Foo(): v () {}
Foo::~Foo() {}
Foo::add_int(int x) {
  v.append(x);
}

存储在v中的向量显然在内部存储了一个指向堆分配内存的指针,需要释放,但我从未释放它。然而,Valgrind表示,使用这种代码根本不会泄漏。

秘密在于c++的析构函数。你写了一个"什么都不做"(~Foo),但在c++中,当类被销毁时,成员变量会自动被销毁。

vector的析构函数只是销毁每个包含的元素,然后释放它的内部数组。

您没有为new动态分配v,因此没有必要为delete分配它。

c++保证在销毁Foo实例时自动销毁成员变量,并由vector处理自己的事务。

当vector对象被销毁时,vector类的析构函数将释放内存(当Foo对象被销毁时,vector对象本身也将被销毁)

因为你是在堆栈上分配vector的,所以当foo超出作用域时,它的所有堆栈变量的析构函数都会被自动调用。在vector对象上调用析构函数时,将调用vector对象中所有元素的析构函数。

如果你在堆上分配了向量,你就必须手动调用删除操作,或者更好的是,你可以使用智能指针来自动处理。