认为:
struct Foo
{
int _b;
std::string _name;
};
class Bar
{
public:
vector<Foo>hold;
};
如果在析构函数上没有调用hold.clear()
,是否意味着内存泄漏?我说的是对象,而不是指针,因为据我所知,push_back
它会创建原始对象的副本;
认为:
struct Foo
{
int _b;
std::string _name;
};
class Bar
{
public:
vector<Foo>hold;
};
如果在析构函数上没有调用hold.clear()
,是否意味着内存泄漏?我说的是对象,而不是指针,因为据我所知,push_back
它会创建原始对象的副本;
不,没有内存泄漏。当 aBar
超出范围时,它的数据成员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
}
当一个对象被销毁时,它的所有成员也会被销毁。因此 Bar 的(自动生成的)析构函数将调用其持有成员的析构函数,该成员将调用其元素的析构函数。
总而言之:一切都会自动销毁。这是 C++ 中的保证:如果您按值操作对象,则可以保证当它们超出范围时它们将被销毁。您唯一需要明确销毁的是已在堆上分配的对象(即使用新对象)。