以下是代码段:
_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> > >
任何建议都会感激不尽。
答案 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));
希望这个问题能为你遇到的问题提供一些提示。