vector访问失效的问题
程序的崩溃堆栈如下
coredump的位置是在vector的push_back函数,push_back调用的是_M
//销毁vector里的元素,即调用vector中各元素的析构函数
std::_Destroy(this->_M_impl._M_start, this->_M_impl._M_finish);
// 收回存放各元素的空间,即free
_M_deallocate(this->_M_impl._M_start,this->_M_impl._M_end_of_storage - this->_M_impl._M_start);
this->_M_impl._M_start = __new_start.base(); //数据结构指向新申请的内存空间
this->_M_impl._M_finish = __new_finish.base();
this->_M_impl._M_end_of_storage = __new_start.base() + __len;
vector动态内存增长的过程如下:
1) 申请一块更大的内存空间以存储新数据。
2) 将数据从旧内存空间拷贝到新内存空间。
3) 析构旧内存空间中的对象。
4) 释放旧内存空间
在公司环境下进行测试,程序两次挂掉,一次是挂在std::_Destroy,一次是挂在_M_deallocate,所以能初步判断出_M_impl._M_start和_M_impl._M_finish地址之间存在无法进行内存回收的元素。
如果this->_M_impl._M_start指向的是一块已经释放的内存空间,那么再一次释放vector中元素的内存空间,就会出现问题。
类似于执行了两次delete ptr;是linux内存管理中常见的double free情况。
比如vector中的对象已经被释放过,那么再次释放就会出问题,所以主要是过下是否有被复用的情况?
而公司的业务处理逻辑是
#include <iostream>
using namespace std;
Class Test
{
public:
vector<string> m_vecClients;
}
std::map<int,Test*> mapClientRelation;
然后多线程读写操作mapClientRelation,其中操作有增删查。
解决方案:多线程访问vector时要进行加锁,如果预先知道vector存储元素的数据规模时,可以用vector的reserve方法预先分配好内存,免的在使用过程中动态增长。