为什么在这里不调用析构函数

时间:2019-12-24 20:45:39

标签: c++

考虑以下代码

vector<myCustomType> v;
for (int i = 0; i != 5; i++)
{
   v.push_back( myCustomType () );
}

我一直在读书,书中说当对象超出范围时调用析构函数,并使用shared_pointer或其他内存技巧来防止对象被破坏。

这样,我希望下面的代码使程序崩溃:

v[0]. someMemberFunc ();

但是,这不会发生。实际上,该对象尚未销毁。为什么会这样?

谢谢!

2 个答案:

答案 0 :(得分:3)

v尚未超出范围,并保留其5个myCustomType对象。因此,访问其中之一并在其上调用成员函数非常好。

答案 1 :(得分:1)

{
   v.push_back( myCustomType () );
}

在这里,您要将对象放入向量中。向量是该对象的所有者(该对象存储在向量中),因此该对象上的作用域现在与该向量上的作用域匹配。

请考虑:

std::vector<CustomType*> v; //store pointers
for (int i = 0; i != 5; i++)
{
   CustomType ct = myCustomType(); // Get a CustomType object
   v.push_back(&ct);
}

在这种情况下,如您所料,尝试运行v[0]->someMemberFunc();将是未定义的行为(阅读:非常不好)。由于向量实际上并不是存储对象,而是仅存储对象的地址,因此无法保证其指向的对象存在。而且,由于ct的范围仅在for中,因此它不存在于循环之外!

请注意,区别在于所有权,对象的存储位置和存储方式。