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

how to delete a shared pointer value in vector

本文关键字:共享 指针 何删除 删除      更新时间:2023-10-16

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

则生成向量:CCD_ 2;

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

现在我想删除向量中的特定元素(children)(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),这将删除由共享指针内的指针动态分配和指向的内存。(只有矢量中指向动态存储器的共享指针,即计数为1)

提前谢谢。

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

如果您知道引用计数为1。。。但是

使用共享指针的原因之一正是因为不知道什么时候某个东西是最后一个实例。如果你有那么多知识。。。并且该向量是"拥有"集合,则考虑std::unique_ptr

等替代方案

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

vector中删除shared_ptr时,应该会看到相同的行为。

示例代码:

#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 scopen"; 
      std::vector<std::shared_ptr<A>> ptrList;
      ptrList.push_back(ptr1);
      ptrList.push_back(ptr2);
   }
   std::cout << "Out of the nested scopen"; 
   return 0;
}

OUtput:

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