假设:
struct Foo
{
int _b;
std::string _name;
};
class Bar
{
public:
vector<Foo>hold;
};
如果没有在析构函数上调用hold.clear()
,是否意味着内存泄漏?
我说的是对象,而不是指针,因为据我所知push_back
创建了原始对象的副本;
答案 0 :(得分:1)
不,没有内存泄漏。当Bar
超出范围时,它的数据成员hold
将被销毁,并且因为std::vector
设计得很好,所以它所拥有的所有元素都会被销毁。
struct Foo
{
int _b;
std::string _name;
~Foo() { std::cout << "Foo destructor"; }
};
class Bar
{
public:
vector<Foo>hold;
};
int main()
{
{
Bar b;
b.hold.push_back(Foo());
} // Foo, vector<Foo> and b instances destroyed here
}
答案 1 :(得分:1)
当一个物体被摧毁时,它的所有成员也被摧毁。因此Bar的(自动生成的)析构函数将调用其hold成员的析构函数,该成员将调用其元素的析构函数。
总结:一切都会自动销毁。这是C ++中的保证:如果您按值操作对象,则可以保证它们在超出范围时将被销毁。你必须明确销毁的是在堆上分配的对象(即使用new)。