c++ vector造成的内存泄漏问题
作者:helpdoc
这篇文章主要介绍了c++ vector造成的内存泄漏问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
c++ vector造成的内存泄漏
C++中的
std::list
std::array
std::queue
std::map
std::set
std::vector
std::forward_list
std::multiset
std::multimap
std::stack
std::unorderd_map
std::unorderd_multimap
std::unorderd_set
std::unorderd_multiset
在任何成员方法中均不管理程序员动态分配的内存。
先附上解决方法
vector<Data*> g_vec; void release() { // 程序员自己管理 自己动态分配的内存 for_each(g_vec.begin(), g_vec.end(), [](Data*& iter) {delete iter; iter = nullptr; }); }
测试数据:
struct Data { explicit Data(const int val) noexcept :m_var(val) { cout<<"构造函数:"<<this->m_var<<endl; } Data(const Data& other) noexcept { cout<<"copy构造函数:"<<other.m_var<<endl; this->m_var = other.m_var; } Data(Data&& other) noexcept { cout<<"move构造函数:"<<other.m_var<<endl; this->m_var = other.m_var; other.m_var = 0; } Data& operator=(const Data& other) noexcept { if(this == &other) { return *this; } cout<<"赋值运算符函数:"<<other.m_var<<endl; this->m_var = other.m_var return *this; } Data& operator=(Data&& other) noexcept { if (this == &other) { return *this; } cout<<"move赋值运算符函数:"<<other.m_var<<endl; this->m_var = other.m_var; other.m_var = 0; return *this; } ~Data() { cout<<"析构函数:"<<this->m_var<<endl; } private: int m_var; };
几个重点
- vector<Data*>在vector的任何方法中和中间过程都不调用Data的成员函数。
- Data的copy构造的参数必须是const,否则报错: <没有可用的复制构造函数或复制构造函数声明为"explicit">
- move构造和move赋值运算符必须是noexcept,否则调用copy构造和普通赋值运算符
内存分配策略
vector<Data*> dataVec; for (int i=0;i<10;++i) { dataVec.push_back(new Data(i + 1)); cout << "\tmem size:" << dataVec.capacity() << ", vec size:" << dataVec.size() << endl; }
vector.capacity()
返回vector当前分配的内存总量。vector.size()
返回vector当前有多少元素。
vector.push_back的过程是先判断
if (size()==capacity()) capacity=1.5*capacity;
并不是在原来的基础上扩大2倍。
修改capacity的三种方法
vector.reserve(size_type new_len)
如果new_len<=capacity()什么都不做;如果new_len>capacity(),重新分配内存,最后的capacity()可能>=new_lenvector.shrink_to_fit()
重新分配内存使capacity()==size(),意思就是把原来没有用到的内存释放掉。vector.swap
或者std::swap
,交换的过程中包含capacity的改变。
capacity误区
- operator=, vector.assign, vector.erase, vector.clear不会修改capacity
内存释放误区
- vector.clear, vector.earse不会释放程序员自己动态分配的内存
vector——防止内存溢出的处理
利用swap() 交换函数,可进行内存的防止溢出。
如下所示:
vector p1; p1.resize(10000); p1.push_back(1); p1.push_back(2); p1.push_back(3); //当使用内存空间远远小于开辟的空间时,造成内存浪费和内存溢出的危险。 //利用匿名对象的特性:匿名对象使用结束后,内存自动回收。 vector(p1).swap(p1);
可以有效的将内存空间进行回收。
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。