考虑以下代码
vector<myCustomType> v;
for (int i = 0; i != 5; i++)
{
v.push_back( myCustomType () );
}
我一直在读书,书中说当对象超出范围时调用析构函数,并使用shared_pointer或其他内存技巧来防止对象被破坏。
这样,我希望下面的代码使程序崩溃:
v[0]. someMemberFunc ();
但是,这不会发生。实际上,该对象尚未销毁。为什么会这样?
谢谢!
答案 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
中,因此它不不存在于循环之外!
请注意,区别在于所有权,对象的存储位置和存储方式。