C 语言

关注公众号 jb51net

关闭
首页 > 软件编程 > C 语言 > c++ vector造成的内存泄漏

c++ vector造成的内存泄漏问题

作者:helpdoc

这篇文章主要介绍了c++ vector造成的内存泄漏问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

c++ vector造成的内存泄漏

C++中的

任何成员方法中均不管理程序员动态分配的内存。

先附上解决方法

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*> 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.push_back的过程是先判断

if (size()==capacity()) capacity=1.5*capacity; 

并不是在原来的基础上扩大2倍。

修改capacity的三种方法

capacity误区

内存释放误区

vector——防止内存溢出的处理

利用swap() 交换函数,可进行内存的防止溢出。

如下所示:

vector p1;
p1.resize(10000);
p1.push_back(1);
p1.push_back(2);
p1.push_back(3);
//当使用内存空间远远小于开辟的空间时,造成内存浪费和内存溢出的危险。
//利用匿名对象的特性:匿名对象使用结束后,内存自动回收。
vector(p1).swap(p1);

可以有效的将内存空间进行回收。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文