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);

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

总结

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

相关文章

  • C语言中的浮点数存储详解

    C语言中的浮点数存储详解

    这篇文章主要介绍了C语言中的浮点数存储详解,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-03-03
  • C++之string的模拟实现过程

    C++之string的模拟实现过程

    这篇文章主要介绍了C++之string的模拟实现过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-06-06
  • C++迭代器失效问题及解决

    C++迭代器失效问题及解决

    这篇文章主要介绍了C++迭代器失效问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • Qt中QPixmap、QImage、QPicture、QBitmap四者区别详解

    Qt中QPixmap、QImage、QPicture、QBitmap四者区别详解

    Qt 提供了四个类来处理图像数据:QImage、QPixmap、QBitmap 和 QPicture,本文就详细的介绍一下四者区别,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • C语言中等待socket连接和对socket定位的方法

    C语言中等待socket连接和对socket定位的方法

    这篇文章主要介绍了C语言中等待socket连接和对socket定位的方法,分别为listen()函数和bind()函数的用法,需要的朋友可以参考下
    2015-09-09
  • Ubuntu 环境下的 C/C++ 编译与调试配置方法

    Ubuntu 环境下的 C/C++ 编译与调试配置方法

    本文档详细介绍了如何在Ubuntu环境中使用VSCode进行C/C++的编译与调试配置,通过配置`tasks.json`和`launch.json`,实现了统一管理输出文件、优化调试流程以及跨平台兼容性,配置了`g++`编译器和`gdb`调试器,并使用C/C++插件来提高开发效率,感兴趣的朋友跟随小编一起看看吧
    2024-11-11
  • C++扫盲篇之指针详解

    C++扫盲篇之指针详解

    C++中一个指针的使用就已经让很多人欲哭无泪,可是更不幸的是他还有指向指针的指针,这篇文章主要给大家介绍了关于C++扫盲篇之指针的相关资料,需要的朋友可以参考下
    2022-03-03
  • C++中using的三种用法举例详解

    C++中using的三种用法举例详解

    最近在使用中,发现了一种以前没学过的using用法,于是在这里,将using的几种用法总结一下,下面这篇文章主要给大家介绍了关于C++中using的三种用法,需要的朋友可以参考下
    2023-02-02
  • C语言实现一个简单的扫雷游戏

    C语言实现一个简单的扫雷游戏

    扫雷是电脑上很经典的游戏,特意去网上玩了一会,几次调试之后,发现这个比三子棋要复杂一些,尤其是空白展开算法上和堵截玩家有的一拼,与实际游戏差别较大,不能使用光标,下面来详解每一步分析
    2021-10-10
  • C++使用一棵红黑树同时封装出map和set实例代码

    C++使用一棵红黑树同时封装出map和set实例代码

    红黑树(Red Black Tre)是一种自平衡二叉查找树,是在计算机科学中用到的一种数据结构,典型的用途是实现关联数组,下面这篇文章主要给大家介绍了关于C++使用一棵红黑树同时封装出map和set的相关资料,需要的朋友可以参考下
    2023-04-04

最新评论