我有一个以这种方式宣布的地图:
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是一个用于标识面板的字符串。
这是删除和删除的正确方法吗?在地图和/或对中使用指针是否存在问题?擦除后我得到一个“分段错误(核心转储)”,但我不明白问题是删除还是其他代码(可能与多线程有关)。
答案 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 ) ;