c++ vector造成的内存泄漏问题
作者:helpdoc
这篇文章主要介绍了c++ vector造成的内存泄漏问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
c++ vector造成的内存泄漏
C++中的
std::liststd::arraystd::queuestd::mapstd::setstd::vectorstd::forward_liststd::multisetstd::multimapstd::stackstd::unorderd_mapstd::unorderd_multimapstd::unorderd_setstd::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);
可以有效的将内存空间进行回收。
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
