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

C++ 为什么这里不调用析构函数,c++,C++,考虑以下代码 vector<myCustomType> v; for (int i = 0; i != 5; i++) { v.push_back( myCustomType () ); } 然而,这并没有发生。事实上,这个物体还没有被摧毁。为什么会这样 谢谢 v未超出范围,并保留其5个myCustomType对象。因此,访问其中一个函数并对其调用成员函数是非常好的 { v.push_back( myCustomType () ); } 这里你要把一个物体放到你的向量

考虑以下代码

vector<myCustomType> v;
for (int i = 0; i != 5; i++)
{
   v.push_back( myCustomType () );
}
然而,这并没有发生。事实上,这个物体还没有被摧毁。为什么会这样

谢谢

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

{
   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的范围仅限于此,所以它不存在于环路之外

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

vector包含推送备份内容的副本,因此无论原始内容发生了什么。即使v[0]是一个已销毁的对象,调用无效对象的成员也不一定会使程序崩溃。这是未定义的行为,任何事情都可能发生。
std::vector<CustomType*> v; //store pointers
for (int i = 0; i != 5; i++)
{
   CustomType ct = myCustomType(); // Get a CustomType object
   v.push_back(&ct);
}