向量中的擦除功能不会删除指针吗?

时间:2014-05-25 23:59:04

标签: c++ arrays pointers recursion vector

我试图以递归方式打印出存储在矢量中的动态指针数组中的数据。 使用矢量的擦除功能,我想出了这个代码:

void output(vector<Person*> array)  
{
   unsigned long size=array.size();
   if(size==0){
   }
   else{
      array[0]->displayData();
      array.erase(array.begin());
      output(array);
    }
}

虽然此代码有效(我能够打印出所有数据),但删除功能并没有删除&#34;指针。

所以当我在驱动程序中使用相同的数组变量再次调用输出函数并且能够重新打印数据时,我真的很惊讶。

如果擦除功能没有删除指针,我怎么能相应地打印数据? 如果它没有删除指针,因为它是动态的,那么&#34;擦除&#34;函数用指针在特定位置吗?

感谢。

3 个答案:

答案 0 :(得分:2)

您的output按值获取向量,因此除了副本之外,您不会删除任何内容。也许我没有理解你的问题,你能发布更多代码吗?并且不知道为什么你需要一个递归函数来擦除向量,为什么不只是调用array.erase(array.begin(), array.end())?顺便说一句,你不应该调用你的参数arrayarray<array>中定义的类似静态数组的类,所以有名字冲突不是一个好主意(如果您可能包含<array>using namespace std;

答案 1 :(得分:1)

  

如果擦除功能没有删除指针,我怎么能相应地打印数据?

由于您始终按值传递数组,因此您始终会删除原始数组的副本。而且,这些指针所引用的对象永远不会被删除。

  

如果它没有删除指针,因为它是动态的,那么&#34;擦除&#34;&#34;&#34;擦除&#34;函数用指针在特定位置吗?

绝对没有。从容器中删除元素时,它只是被破坏的元素,而不是它所指向的元素。

向量如何知道您存储了指向分配有new的内容的指针,并且它不是与其他对象共享的东西?如果你想指定实际的矢量&#34;拥有&#34;这些对象,使用适当的智能指针,或直接存储对象(而不是指向它们的指针)。


另外,正如上面的评论中已经说过的那样,从向量前面移除元素是非常低效的,因为每次它必须将所有其他元素移回一个地方,所以清空向量变为O(N ^ 2)当它是O(1)时的操作。

重构算法以从后面弹出元素,或者只是在结尾处清除整个向量。

答案 2 :(得分:0)

一点建议

void output( vector<Person*>& pvec )  
{
    for( auto p : pvec )
    {
        p->displayData();
        // delete p; // uncomment this if you also want content destroyd
    }
    pvec.clear();
}