如何删除向量中的共享指针值

时间:2014-11-07 05:34:35

标签: c++ vector shared-ptr

我将类型定义为共享指针:typedef shared_ptr<Myclass> Sptr;

然后是一个向量:vector<Sptr> vectr;

现在我在向量中存储了几个共享指针,每个都指向一个动态分配的内存。

现在我想删除vector中的特定元素(child)(children.begin()到children.end())。

ItemList::iterator it = find(children.begin(), children.end(), child);
if (it != children.end())
{
    //delete it;
    it = children.erase(it);
}    

现在,children.erase(it)将删除由共享指针内的指针动态分配和指向的内存。 (只有指向动态存储器的向量中的共享指针,即count为1)

提前致谢。

2 个答案:

答案 0 :(得分:3)

是。如果共享指针的唯一实例是向量中的实例,则将其从向量中删除将导致该共享指针实例的析构函数运行。这将释放共享指针拥有的对象的相关内存。

如果你知道引用计数是一个...但是......

...使用共享指针的原因之一正是当某些东西是最后一个实例时,你不知道。如果你有那么多的知识......而这个载体是“拥有”的集合,那么考虑像std::unique_ptr

这样的替代品。

答案 1 :(得分:1)

当删除shared_ptr时,它会删除它所持有指针的对象,当且仅当它是持有指向该对象的指针的最后一个shapred_ptr时。如果另一个shared_ptr拥有指向该对象的指针,则该对象不会被删除。

shared_ptr删除vector时,您会看到相同的行为。

示例代码:

#include <iostream>
#include <vector>
#include <memory>

struct A
{
   ~A() {std::cout << "Came to ~A()\n";}
};

int main(int argc, char** argv)
{
   std::shared_ptr<A> ptr1(new A());
   std::shared_ptr<A> ptr2(new A());

   {
      std::cout << "In the nested scope\n"; 
      std::vector<std::shared_ptr<A>> ptrList;
      ptrList.push_back(ptr1);
      ptrList.push_back(ptr2);
   }

   std::cout << "Out of the nested scope\n"; 

   return 0;
}

输出:

In the nested scope
Out of the nested scope
Came to ~A()
Came to ~A()