欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

任何成員方法中均不管理程序員動態(tài)分配的內存。

先附上解決方法

vector<Data*> g_vec;
void release()
{
    // 程序員自己管理 自己動態(tài)分配的內存
    for_each(g_vec.begin(), g_vec.end(), [](Data*& iter) {delete iter; iter = nullptr; });
}

測試數(shù)據(jù):

struct Data
{
	explicit Data(const int val) noexcept :m_var(val)
	{
		cout<<"構造函數(shù):"<<this->m_var<<endl;
	}
	Data(const Data& other) noexcept
	{
		cout<<"copy構造函數(shù):"<<other.m_var<<endl;
		this->m_var = other.m_var;
	}
	Data(Data&& other) noexcept
	{
		cout<<"move構造函數(shù):"<<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<<"賦值運算符函數(shù):"<<other.m_var<<endl;
		this->m_var = other.m_var
		return *this;
	}
	Data& operator=(Data&& other) noexcept
	{
		if (this == &other)
		{
			return *this;
		}
		cout<<"move賦值運算符函數(shù):"<<other.m_var<<endl;
		this->m_var = other.m_var;
		other.m_var = 0;
		return *this;
	}
	~Data()
	{
		cout<<"析構函數(shù):"<<this->m_var<<endl;
	}
private:
	int m_var;
};

幾個重點

  • vector<Data*>在vector的任何方法中和中間過程都不調用Data的成員函數(shù)。
  • Data的copy構造的參數(shù)必須是const,否則報錯: <沒有可用的復制構造函數(shù)或復制構造函數(shù)聲明為"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誤區(qū)

  • operator=, vector.assign, vector.erase, vector.clear不會修改capacity

內存釋放誤區(qū)

  • vector.clear, vector.earse不會釋放程序員自己動態(tài)分配的內存

vector——防止內存溢出的處理

利用swap() 交換函數(shù),可進行內存的防止溢出。

如下所示:

vector p1;
p1.resize(10000);
p1.push_back(1);
p1.push_back(2);
p1.push_back(3);
//當使用內存空間遠遠小于開辟的空間時,造成內存浪費和內存溢出的危險。
//利用匿名對象的特性:匿名對象使用結束后,內存自動回收。
vector(p1).swap(p1);

可以有效的將內存空間進行回收。

總結

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • C語言用封裝方法實現(xiàn)飛機大戰(zhàn)游戲

    C語言用封裝方法實現(xiàn)飛機大戰(zhàn)游戲

    這篇文章主要為大家詳細介紹了C語言用封裝方法實現(xiàn)飛機大戰(zhàn)游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • C++實現(xiàn)二叉樹的堂兄弟節(jié)點查詢

    C++實現(xiàn)二叉樹的堂兄弟節(jié)點查詢

    C++實現(xiàn)二叉樹的堂兄弟節(jié)點查詢,是指在二叉樹中,找到兩個節(jié)點深度相同但父節(jié)點不同的節(jié)點,即為堂兄弟節(jié)點。實現(xiàn)這一功能可以通過遍歷二叉樹并記錄節(jié)點深度和父節(jié)點來實現(xiàn)
    2023-04-04
  • Qt使用QCustomPlot的實現(xiàn)示例

    Qt使用QCustomPlot的實現(xiàn)示例

    QCustomPlot是一個基于Qt C++的圖形庫,用于繪制和數(shù)據(jù)可視化,并為實時可視化應用程序提供高性能服務,本文主要介紹了Qt使用QCustomPlot的實現(xiàn)示例,感興趣的可以了解一下
    2024-01-01
  • C++使用數(shù)組來實現(xiàn)哈夫曼樹

    C++使用數(shù)組來實現(xiàn)哈夫曼樹

    給定N個權值作為N個葉子結點,構造一棵二叉樹,若該樹的帶權路徑長度達到最小,稱這樣的二叉樹為最優(yōu)二叉樹,也稱為哈夫曼樹(Huffman?Tree)。哈夫曼樹是帶權路徑長度最短的樹,權值較大的結點離根較近
    2022-05-05
  • C語言制作貪吃蛇小游戲

    C語言制作貪吃蛇小游戲

    這篇文章主要為大家詳細介紹了C語言制作貪吃蛇小游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-07-07
  • DEV C++自動補全文件頭的設置操作教程

    DEV C++自動補全文件頭的設置操作教程

    Dev-C++ 是一款輕量級的集成開發(fā)環(huán)境 (IDE),主要用于 C 和 C++ 的程序編寫,它提供了基本的功能來幫助開發(fā)者更高效地工作,其中包括文件頭的自動補全功能,本文就給大家介紹了DEV C++自動補全文件頭的設置操作教程,需要的朋友可以參考下
    2025-04-04
  • C++實現(xiàn)圖書管理程序

    C++實現(xiàn)圖書管理程序

    這篇文章主要為大家詳細介紹了C++實現(xiàn)圖書管理程序,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • c++ static詳細使用分析

    c++ static詳細使用分析

    在C++中,static是一個關鍵字,用于聲明靜態(tài)成員、靜態(tài)局部變量以及靜態(tài)函數(shù),這篇文章主要介紹了c++ static詳細分析,需要的朋友可以參考下
    2024-05-05
  • [c++]變量聲明與定義的規(guī)則詳解

    [c++]變量聲明與定義的規(guī)則詳解

    這篇文章主要介紹了[c++]變量聲明與定義的規(guī)則詳解,對于學習c++的朋友來說這是一個很細膩的文章,代碼完整,需要的朋友可以參考下
    2021-04-04
  • C++動態(tài)內存分配(new/new[]和delete/delete[])詳解

    C++動態(tài)內存分配(new/new[]和delete/delete[])詳解

    這篇文章主要介紹了C++動態(tài)內存分配(new/new[]和delete/delete[])詳解的相關資料,需要的朋友可以參考下
    2017-05-05

最新評論