我是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
}
由于
答案 0 :(得分:2)
target
是类型的名称。你不能delete target;
。
您也无法删除智能指针。只能删除指针类型,智能指针 - 尽管它们的名字 - 是类类型。
不删除目标;但删除它;
您也无法删除it
。 it
是一个迭代器;不是指针。它指的是指向对象的智能指针;它没有引用对象本身。
您也不能删除智能指针所拥有的指针。当指向它的所有共享指针被销毁(或指向其他地方)时,指向的对象会自动销毁。因此,如果共享指针的唯一副本在该映射中,那么简单地从地图中删除指针将导致指向对象被销毁。
您显然尝试删除所有共享对象。这可以通过从地图中删除所有智能指针轻松实现: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
参与该对象的所有权。