为什么我需要在载体中删除动态创建的项目,手动? 他们为什么不被删除或矢量删除了所谓的析构函数?
通常,这样的事情,但为什么需要?
vector<int*> v;
for (vector<int*>::iterator it = v.begin(); it != v.end(); ++it)
{
delete *it;
}
为什么我需要在载体中删除动态创建的项目,手动? 他们为什么不被删除或矢量删除了所谓的析构函数?
通常,这样的事情,但为什么需要?
vector<int*> v;
for (vector<int*>::iterator it = v.begin(); it != v.end(); ++it)
{
delete *it;
}
首先,你保存在您的载体原始指针。 这些指针只是指针。 他们可以指向任何地方。 他们可以指向本地对象,不能被删除delete
。 即使它们指向动态创建的对象,这并不一定意味着用户希望他们的矢量死。 矢量应该如何知道这一切?
它是对象所有权的问题。 谁拥有对象是负责其适当和及时删除。 普通原始指针不表达所有权。 这就是为什么向量不能对对象是否需要被删除或没有任何假设。 如果你想告诉大家,它拥有自己的动态对象的载体,应用相应的智能指针。
其次,注意,您删除技术并不一定是在一般情况下是安全的。 有些标准集装箱假设你在其中存储的数据始终有效。 当你delete
每个向量元素,在矢量数据变为“无效”(指针变得不确定)。 这是一个向量确定。 但这样做在一个“聪明”的容器这样的事情,像std::map
或std::unordered_set
例如,可以并会导致问题。 即使你破坏容器本身随即,这是完全有可能的是,容器的销毁算法可能需要分析(比较,哈希等)的各个元素的值。 而你刚刚杀了他们所有的周期。
智能指针自然解决这个问题。 但是,如果你要使用手动delete
存储在一个标准集装箱裸指针,步骤更好的顺序将是这个
i
并将其存储在指针p
i
从容器 delete p
到底你结束了一个空的容器,并delete
d数据。 同样,你的方法将简单的序列工作,像std::vector
或std::list
,但不要用命令或散列的人做到这一点。
因为语言没有办法知道你是否需要他们时,你就大功告成了保持活着的方式。 如果你插入一些指针栈对象或类似的东西? 繁荣。
然而,这可以通过使用智能指针,这将实现一个适当的策略,以自动销毁补救。 unique_ptr
和shared_ptr
是最常见的和有用的。
析构函数不叫,因为指针不拥有它指向的对象。
在C ++ 11,一个std::unique_ptr<T>
确实拥有它所指向的对象。 在这种情况下,指针被释放时调用析构函数,这可能是你想要的行为。 (如果你没有一个C ++编译器11,但有一个合理的预最近-C ++编译器11, unique_ptr
仍可作为TR1的一部分。)
实施vector
只是做只删除其内存。 指针没有deconstructors。 而在C ++中,没有垃圾收集或逻辑地看到,它是指针和递归删除它。
如果您想参加下一次会议ISO和建议,是我的客人,但对我来说,我只是把它放在一个inline
函数:
template<class T>
public static inline void deleteVectorPointer(std::vector<T*> v)
{
for (vector<T*>::iterator i = v.begin(); i != v.end(); i++)
{
delete *i;
}
}