STL vector.clear()导致内存双重释放或损坏是pthreads程序

时间:2016-09-19 09:19:00

标签: c++ stl pthreads

以下是代码段:

_ws.sendAsync()

service_hosts的类型为pthread_mutex_lock(&hostsmap_mtx); for (int i = 0; i < service_hosts[service].size(); ++i) poolmanager->delPool(service, service_hosts[service][i].first); service_hosts[service].clear(); for (int i = 0; i < servers->count; ++i) { string temp(servers->data[i]); int pos = temp.find(':'); string server = temp.substr(0, pos); string port = temp.substr(pos + 1, temp.length() - pos - 1); service_hosts[service].push_back(make_pair(server, atoi(port.c_str()))); config.server = server; config.port = atoi(port.c_str()); poolmanager->addPool(service, config); } pthread_mutex_unlock(&hostsmap_mtx);

崩溃原因:
*错误&#39; ./ HttpProxy&#39;:双重免费或损坏(fasttop):0x00007f6fe000a6b0 *

和GDB bt:

map<string, vector<pair<string, int> > >

任何建议都会感激不尽。

2 个答案:

答案 0 :(得分:0)

使用valgrind(或您可以访问的任何其他类似工具)很容易诊断双重释放。它将告诉您谁释放了您正在访问的内存,这将引导您找到问题的根源。如果您在阅读valgrind输出时遇到问题,请在此处发布,我们可以帮助您。

答案 1 :(得分:0)

这个问题可能不容易找出根本原因。但最后我找出原因。因为stl string不是线程安全的,stl string赋值是引用计数和COW。例如:

string str = "stl::string";
string temp = str; //this is ref-count,COW
string temp2 = str.c_str(); //this is memory copy, cause string don't know how to handle const char *, just copy it

我的修复方法是将const char *传递给stl vecotrs,并在多线程条件下使用const char *作为函数参数,如果存在争用。例如:

map<string, vector<pair<string, int> > > Hostmap;
string service = "service";
string host = "host";
//Note: not service and host, but service.c_str() and host.c_str()
Hostmap[service.c_str()].push_back(make_pair(host.c_str(), 9966));

希望这个问题能为你遇到的问题提供一些提示。