如何使用一对和多指针在地图中删除和删除?

时间:2013-11-19 08:37:30

标签: c++ c++11 map

我有一个以这种方式宣布的地图:

static map<string, pair<Socket*,queue<string>*>> panels;

其中Socket是用于封装Linux套接字的用户定义类。 Socket *用作指向自动分配变量的指针,该队列是动态分配的。 我以这种方式在地图中插入新元素:

panels.insert(make_pair(cdhw, make_pair(&sock, new queue<string>())));

当我必须擦除地图元素时,我这样做:

delete( (panels.find(cdhw))->second.second ); //delete queue
panels.erase(cdhw);

cdhw是一个用于标识面板的字符串。

这是删除和删除的正确方法吗?在地图和/或对中使用指针是否存在问题?擦除后我得到一个“分段错误(核心转储)”,但我不明白问题是删除还是其他代码(可能与多线程有关)。

3 个答案:

答案 0 :(得分:0)

您确定在致电find时,您确实在地图上有元素吗?您可以添加此项,以检查找到的元素:

auto It = panels.find(cdhw);
if(It != panels.end())
{
    // The element was found
    delete((It->second.second); //delete queue
    panels.erase(cdhw);
}
else
{
    // The element was not found, is this an error case?
}

答案 1 :(得分:0)

对你的地图使用static变量以及在堆栈上分配的Socket*(自动变量)听起来像是一个可怕的想法。如果您只是转移到动态分配的套接字,它应该改进。

答案 2 :(得分:0)

正如其他人所提到的,在c ++ 11中,你最好不要按价值使用东西,因为使用移动语义你不需要为复制构造函数支付任何开销。所以你要像这样定义你的地图:

map<string, pair<Socket *, queue<string>>> panels ;

您可以使用以下方式进一步优化您的创作:

panels.emplace(cdhw, make_pair(&sock, queue<string>()));

然后擦除就是:

panels.erase( cdhw ) ;