【问题标题】:is the array/vector of pointers can delete the pointer auto? [duplicate]指针的数组/向量是否可以自动删除指针? [复制]
【发布时间】:2013-05-08 05:45:39
【问题描述】:
std::vector<Object *> pVector;

当超出范围时,指针数组/向量是否可以自动删除每个指针元素?还是必须手动删除每个对象?

那么我是否可以这样认为:如果向量/数组存储无指针元素,它会自动调用解构函数?但是如果存储了指针,它应该手动删除元素吗?

【问题讨论】:

    标签: c++ pointers


    【解决方案1】:

    vector 正确销毁存储在向量中的对象IN。将调用析构函数。如果你有一个指针向量,那么这意味着指针自己的析构函数(而不是它指向的)。

    原始指针的析构函数什么都不做。如果您有一个指向程序另一部分将销毁的对象的非拥有指针,这就是您想要的。

    智能指针的析构函数会做任何必要的事情来确保对象在正确的时间被释放。对于unique_ptr,就是现在。对于shared_ptr,只要引用计数为零。

    使用正确类型的指针和信任向量在元素被擦除时触发与该指针相关的行为。

    【讨论】:

      【解决方案2】:

      当 std::vector 被销毁时,它调用 Object * 析构函数而不是 Object 所以只有指向内存的指针被销毁。

      您应该使用智能指针(std::shared_ptr&lt;Object&gt; or std::unique_ptr&lt;Object&gt;)boost::ptr_vector&lt;Object&gt;,它们将为您管理内存。

      【讨论】:

        【解决方案3】:

        不,vector 只会删除它所拥有的内存,这是用于保存指针的内存 - 实际上,它将是一个一定大小的数组,例如:

        Object **array = new Object*[size]; 
        

        当析构函数被调用时,所有被删除的是这个数组存储:

        delete[] array;
        

        如您所见,这不会释放那些指针指向的任何东西。这就是为什么您应该使用 vectorunique_ptrshared_ptr 而不是原始指针的原因。

        【讨论】:

          猜你喜欢
          • 2015-08-09
          • 2018-09-12
          • 1970-01-01
          • 2011-05-10
          • 2015-07-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多