我正在使用一个小型库来建立数据库连接池。
但是,当我运行提供的示例时,在它调用DestroyPool时,我得到的映射不是可递增的断言失败。
这是代码
template <typename T>
int CommonDatabasePool<T>::DestroyPool(){
typename map<T*, short>::iterator iter;
for( iter = poolmap.begin(); !poolmap.empty()&& iter != poolmap.end(); iter++ ) {
if(iter->second == DBPOOL_POOLEDCON_FREE){
MyReleaseConcreteConnection(iter->first);
poolmap.erase(iter);
}
}
exitkeepalivepool = true;
if(XSemPost(&semhandle)==-1){
}
if(XThreadJoin(&threadhandle)==-1){
}
return poolmap.size();
}
这里有什么东西看起来可疑会导致这样的错误吗?
无论我是否使用任何连接,它仍然会这样做......
由于
答案 0 :(得分:3)
从根本上说,您正在执行此代码:
for(iter = poolmap.begin(); iter != poolmap.end(); iter++) {
poolmap.erase(iter);
}
此代码尝试在不再有效的迭代器上调用iter++
。
您可以通过以下方式解决此问题:
typename map<T*, short>::iterator iter = poolmap.begin();
while (iter != poolmap.end()) {
if (iter->second == DBPOOL_POOLEDCON_FREE) {
MyReleaseConcreteConnection(iter->first);
iter = poolmap.erase(iter);
} else {
iter++;
}
}