我只是学习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表示使用此代码根本不泄漏。我觉得理解为什么会有助于提高我对语言的理解。
答案 0 :(得分:6)
秘密是C ++的析构函数。你写了一个“什么都不做”(~Foo
),但在C ++中,当类被销毁时会自动破坏成员变量。
vector
的析构函数只是破坏每个包含的元素,然后释放其内部数组。
答案 1 :(得分:2)
您没有使用v
动态分配new
,因此无需delete
。
C ++保证当Foo实例被破坏时会自动销毁成员变量,并且向量会自行排序。
答案 2 :(得分:1)
当向量对象被销毁时,向量类的析构函数将释放内存(当你的Foo对象被销毁时,向量对象本身将被销毁)
答案 3 :(得分:0)
因为你在堆栈上分配了向量,当foo超出范围时,所有它的堆栈变量都会自动调用它们的析构函数。当在向量上调用析构函数时,它将调用其中所有元素的析构函数。
如果你在堆上分配了矢量,你必须手动调用它上面的删除,或者更好的是你可以使用智能指针自动处理它。