shared_ptr删除struct里面的对象

时间:2018-02-20 15:06:22

标签: c++ struct shared-ptr

我是c ++初学者,用指针

失败了

我想在使用后删除指针以释放内存

shared_ptr<target> target_ptr(new targ(url));

struct targ
{targ(const std::string& p_url) : url(p_url) {}
std::string                         url;...

...
map<string, shared_ptr<target> >::iterator it;

for (it = targets.begin(); it != targets.end() ; ++it)
{
    delete target;//????? it doesn't work
}

由于

2 个答案:

答案 0 :(得分:2)

target是类型的名称。你不能delete target;

您也无法删除智能指针。只能删除指针类型,智能指针 - 尽管它们的名字 - 是类类型。

  

不删除目标;但删除它;

您也无法删除itit是一个迭代器;不是指针。它指的是指向对象的智能指针;它没有引用对象本身。

您也不能删除智能指针所拥有的指针。当指向它的所有共享指针被销毁(或指向其他地方)时,指向的对象会自动销毁。因此,如果共享指针的唯一副本在该映射中,那么简单地从地图中删除指针将导致指向对象被销毁。

您显然尝试删除所有共享对象。这可以通过从地图中删除所有智能指针轻松实现:targets.clear()

答案 1 :(得分:0)

您可以使用std::shared_ptr的{​​{1}}会员功能:

reset()

或:

for (auto it = targets.begin(); it != targets.end() ; ++it)
{
    it->second.reset();
}

这样做会在指向的for (auto& p: targets) p.second.reset(); 对象上调用delete,如果没有其他target参与该对象的所有权。