为什么我需要手动从载体删除指针?(Why do I need to delete pointers

2019-06-26 18:53发布

为什么我需要在载体中删除动态创建的项目,手动? 他们为什么不被删除或矢量删除了所谓的析构函数?

通常,这样的事情,但为什么需要?

vector<int*> v;
for (vector<int*>::iterator it = v.begin(); it != v.end(); ++it) 
{ 
   delete *it; 
}

Answer 1:

首先,你保存在您的载体原始指针。 这些指针只是指针。 他们可以指向任何地方。 他们可以指向本地对象,不能被删除delete 。 即使它们指向动态创建的对象,这并不一定意味着用户希望他们的矢量死。 矢量应该如何知道这一切?

它是对象所有权的问题。 谁拥有对象是负责其适当和及时删除。 普通原始指针不表达所有权。 这就是为什么向量不能对对象是否需要被删除或没有任何假设。 如果你想告诉大家,它拥有自己的动态对象的载体,应用相应的智能指针。

其次,注意,您删除技术并不一定是在一般情况下是安全的。 有些标准集装箱假设你在其中存储的数据始终有效。 当你delete每个向量元素,在矢量数据变为“无效”(指针变得不确定)。 这是一个向量确定。 但这样做在一个“聪明”的容器这样的事情,像std::mapstd::unordered_set例如,可以并会导致问题。 即使你破坏容器本身随即,这是完全有可能的是,容器的销毁算法可能需要分析(比较,哈希等)的各个元素的值。 而你刚刚杀了他们所有的周期。

智能指针自然解决这个问题。 但是,如果你要使用手动delete存储在一个标准集装箱裸指针,步骤更好的顺序将是这个

  1. 检索元素的值在i并将其存储在指针p
  2. 在擦除元件i从容器
  3. 不要delete p

到底你结束了一个空的容器,并delete d数据。 同样,你的方法将简单的序列工作,像std::vectorstd::list ,但不要用命令或散列的人做到这一点。



Answer 2:

因为语言没有办法知道你是否需要他们时,你就大功告成了保持活着的方式。 如果你插入一些指针栈对象或类似的东西? 繁荣。

然而,这可以通过使用智能指针,这实现一个适当的策略,以自动销毁补救。 unique_ptrshared_ptr是最常见的和有用的。



Answer 3:

析构函数不叫,因为指针不拥有它指向的对象。

在C ++ 11,一个std::unique_ptr<T>确实拥有它所指向的对象。 在这种情况下,指针被释放时调用析构函数,这可能是你想要的行为。 (如果你没有一个C ++编译器11,但有一个合理的预最近-C ++编译器11, unique_ptr仍可作为TR1的一部分。)



Answer 4:

实施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;
    }
}


文章来源: Why do I need to delete pointers from vector manually?