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

 更新时间:2023年08月07日 16:53:06   作者: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_len
  • vector.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);

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

总结

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

相关文章

  • 一文带你入木三分地理解字符串KMP算法以及C++实现

    一文带你入木三分地理解字符串KMP算法以及C++实现

    KMP算法是一种改进的字符串匹配算法,KMP算法的核心是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。本文就来和大家聊聊KMP算法的原理与实现,需要的可以参考一下
    2022-12-12
  • 详解VS2019 dumpbin查看DLL的导出函数

    详解VS2019 dumpbin查看DLL的导出函数

    这篇文章主要介绍了详解VS2019 dumpbin查看DLL的导出函数,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08
  • C++实现有向图邻接表的构建

    C++实现有向图邻接表的构建

    这篇文章主要为大家详细介绍了C++实现有向图邻接表的构建,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-04-04
  • C/C++ 开发神器CLion使用入门超详细教程

    C/C++ 开发神器CLion使用入门超详细教程

    这篇文章主要介绍了C/C++ 开发神器CLion使用入门超详细教程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-04-04
  • Qt GUI图形图像开发之QT表格控件QTableView详细使用方法与实例

    Qt GUI图形图像开发之QT表格控件QTableView详细使用方法与实例

    这篇文章主要介绍了Qt GUI图形图像开发之QT表格控件QTableView详细使用方法与实例,需要的朋友可以参考下
    2020-03-03
  • 基于C语言实现简单的走迷宫游戏

    基于C语言实现简单的走迷宫游戏

    这篇文章主要介绍了基于C语言实现简单的走迷宫游戏,用到双向队列,方便在运行完毕后输出经过的点,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-04-04
  • Visual Studio Code 从简介、安装到配置所需插件详细介绍

    Visual Studio Code 从简介、安装到配置所需插件详细介绍

    这篇文章给大家介绍到vs与vs code的区别,并且会详细介绍vscode的安装步骤,和我所了解过的插件配置,感兴趣的朋友跟随小编一起看看吧
    2020-03-03
  • C语言安全编码之数值中的sizeof操作符

    C语言安全编码之数值中的sizeof操作符

    这篇文章主要介绍了C语言安全编码的数值中的sizeof操作符用法注意事项,需要的朋友可以参考下
    2014-07-07
  • C++私有继承(一)

    C++私有继承(一)

    这篇文章主要介绍了C++私有继承,在私有继承当中,基类的公有成员和保护成员都会成为派生类的私有成员。这意味着基类的方法都会被private关键字描述,我们可以在派生类中使用它,但类对象无法直接调用,下面来看看详细内容吧
    2022-01-01
  • C++11中条件标量和互斥锁应用出现死锁问题

    C++11中条件标量和互斥锁应用出现死锁问题

    这篇文章主要介绍了C++11中条件标量和互斥锁应用出现死锁思考,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-06-06

最新评论