为什么我需要手动删除向量中动态创建的项目?为什么当向量被删除时它们不会被删除或调用它的析构函数?
通常是这样的,但为什么需要呢?
vector<int*> v;
for (vector<int*>::iterator it = v.begin(); it != v.end(); ++it)
{
delete *it;
}
首先,将原始指针存储在向量中。这些指针只是指针。他们可以指向任何地方。它们可以指向本地对象,该对象不能被删除delete
。即使它们指向动态创建的对象,也并不一定意味着用户希望它们与向量一起消亡。向量如何知道这一切?
这是对象所有权的问题。拥有该对象的人有责任正确、及时地删除该对象。普通的原始指针不表示所有权。这就是为什么 Vector 无法对对象是否需要删除做出任何假设。如果您想告诉向量它拥有其动态对象,请使用相应的智能指针。
其次,请注意,您的删除技术在一般情况下不一定是安全的。一些标准容器假设您存储在其中的数据始终有效。当你这样做时delete
在每个向量元素上,向量中的数据变得“无效”(指针变得不确定)。这对于向量来说是可以的。但是在“更智能”的容器中做这样的事情,比如std::map
or std::unordered_set
例如,可能并且将会导致问题。即使您随后立即销毁容器本身,容器的销毁算法也很可能需要分析(比较、散列等)各个元素的值。你用你的自行车把他们都杀了。
智能指针自然就解决了这个问题。但如果你必须使用手册delete
对于存储在标准容器中的原始指针,更好的步骤顺序是这样的
- 检索位于的元素的值
i
并将其存储在指针中p
- 擦除位于
i
从容器中
- Do
delete p
最后你得到一个空容器delete
d 数据。同样,您的方法适用于简单的序列,例如std::vector
or std::list
,但不要对有序或散列的进行此操作。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)