最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

c++ vector造成的內(nèi)存泄漏問題

 更新時間:2023年08月07日 16:53:06   作者:helpdoc  
這篇文章主要介紹了c++ vector造成的內(nèi)存泄漏問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

c++ vector造成的內(nèi)存泄漏

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)分配的內(nèi)存。

先附上解決方法

vector<Data*> g_vec;
void release()
{
    // 程序員自己管理 自己動態(tài)分配的內(nè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<<"構(gòu)造函數(shù):"<<this->m_var<<endl;
	}
	Data(const Data& other) noexcept
	{
		cout<<"copy構(gòu)造函數(shù):"<<other.m_var<<endl;
		this->m_var = other.m_var;
	}
	Data(Data&& other) noexcept
	{
		cout<<"move構(gòu)造函數(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<<"析構(gòu)函數(shù):"<<this->m_var<<endl;
	}
private:
	int m_var;
};

幾個重點

  • vector<Data*>在vector的任何方法中和中間過程都不調(diào)用Data的成員函數(shù)。
  • Data的copy構(gòu)造的參數(shù)必須是const,否則報錯: <沒有可用的復(fù)制構(gòu)造函數(shù)或復(fù)制構(gòu)造函數(shù)聲明為"explicit">
  • move構(gòu)造和move賦值運算符必須是noexcept,否則調(diào)用copy構(gòu)造和普通賦值運算符

內(nèi)存分配策略

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當(dāng)前分配的內(nèi)存總量。
  • vector.size()返回vector當(dāng)前有多少元素。

vector.push_back的過程是先判斷

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

并不是在原來的基礎(chǔ)上擴大2倍。

修改capacity的三種方法

  • vector.reserve(size_type new_len)如果new_len<=capacity()什么都不做;如果new_len>capacity(),重新分配內(nèi)存,最后的capacity()可能>=new_len
  • vector.shrink_to_fit()重新分配內(nèi)存使capacity()==size(),意思就是把原來沒有用到的內(nèi)存釋放掉。
  • vector.swap或者std::swap,交換的過程中包含capacity的改變。

capacity誤區(qū)

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

內(nèi)存釋放誤區(qū)

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

vector——防止內(nèi)存溢出的處理

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

如下所示:

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

可以有效的將內(nèi)存空間進行回收。

總結(jié)

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

相關(guān)文章

  • C語言中的浮點數(shù)存儲詳解

    C語言中的浮點數(shù)存儲詳解

    這篇文章主要介紹了C語言中的浮點數(shù)存儲詳解,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-03-03
  • C++之string的模擬實現(xiàn)過程

    C++之string的模擬實現(xiàn)過程

    這篇文章主要介紹了C++之string的模擬實現(xiàn)過程,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-06-06
  • C++迭代器失效問題及解決

    C++迭代器失效問題及解決

    這篇文章主要介紹了C++迭代器失效問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • Qt中QPixmap、QImage、QPicture、QBitmap四者區(qū)別詳解

    Qt中QPixmap、QImage、QPicture、QBitmap四者區(qū)別詳解

    Qt 提供了四個類來處理圖像數(shù)據(jù):QImage、QPixmap、QBitmap 和 QPicture,本文就詳細的介紹一下四者區(qū)別,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • C語言中等待socket連接和對socket定位的方法

    C語言中等待socket連接和對socket定位的方法

    這篇文章主要介紹了C語言中等待socket連接和對socket定位的方法,分別為listen()函數(shù)和bind()函數(shù)的用法,需要的朋友可以參考下
    2015-09-09
  • Ubuntu 環(huán)境下的 C/C++ 編譯與調(diào)試配置方法

    Ubuntu 環(huán)境下的 C/C++ 編譯與調(diào)試配置方法

    本文檔詳細介紹了如何在Ubuntu環(huán)境中使用VSCode進行C/C++的編譯與調(diào)試配置,通過配置`tasks.json`和`launch.json`,實現(xiàn)了統(tǒng)一管理輸出文件、優(yōu)化調(diào)試流程以及跨平臺兼容性,配置了`g++`編譯器和`gdb`調(diào)試器,并使用C/C++插件來提高開發(fā)效率,感興趣的朋友跟隨小編一起看看吧
    2024-11-11
  • C++掃盲篇之指針詳解

    C++掃盲篇之指針詳解

    C++中一個指針的使用就已經(jīng)讓很多人欲哭無淚,可是更不幸的是他還有指向指針的指針,這篇文章主要給大家介紹了關(guān)于C++掃盲篇之指針的相關(guān)資料,需要的朋友可以參考下
    2022-03-03
  • C++中using的三種用法舉例詳解

    C++中using的三種用法舉例詳解

    最近在使用中,發(fā)現(xiàn)了一種以前沒學(xué)過的using用法,于是在這里,將using的幾種用法總結(jié)一下,下面這篇文章主要給大家介紹了關(guān)于C++中using的三種用法,需要的朋友可以參考下
    2023-02-02
  • C語言實現(xiàn)一個簡單的掃雷游戲

    C語言實現(xiàn)一個簡單的掃雷游戲

    掃雷是電腦上很經(jīng)典的游戲,特意去網(wǎng)上玩了一會,幾次調(diào)試之后,發(fā)現(xiàn)這個比三子棋要復(fù)雜一些,尤其是空白展開算法上和堵截玩家有的一拼,與實際游戲差別較大,不能使用光標(biāo),下面來詳解每一步分析
    2021-10-10
  • C++使用一棵紅黑樹同時封裝出map和set實例代碼

    C++使用一棵紅黑樹同時封裝出map和set實例代碼

    紅黑樹(Red?Black?Tre)是一種自平衡二叉查找樹,是在計算機科學(xué)中用到的一種數(shù)據(jù)結(jié)構(gòu),典型的用途是實現(xiàn)關(guān)聯(lián)數(shù)組,下面這篇文章主要給大家介紹了關(guān)于C++使用一棵紅黑樹同時封裝出map和set的相關(guān)資料,需要的朋友可以參考下
    2023-04-04

最新評論

鞍山市| 将乐县| 保康县| 钦州市| 永州市| 长寿区| 綦江县| 高碑店市| 鹿泉市| 杭锦旗| 辽源市| 津市市| 紫阳县| 新宾| 滦平县| 沙河市| 从江县| 富阳市| 绥中县| 图片| 增城市| 赤壁市| 嵊州市| 迁西县| 启东市| 自贡市| 海宁市| 长春市| 白朗县| 临武县| 龙川县| 濮阳市| 天全县| 石渠县| 张家界市| 子洲县| 拜城县| 镇安县| 开阳县| 精河县| 陆丰市|