亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

C++詳細(xì)講解內(nèi)存管理工具primitives

 更新時間:2022年06月28日 09:25:15   作者:溫逗死  
文章向大家介紹C++內(nèi)存管理primitives,主要包括primitives使用實例、應(yīng)用技巧、基本知識點總結(jié)和需要注意事項,具有一定的參考價值,需要的朋友可以參考一下

primitives

分配釋放屬于是否可重載
malloc()free()C不可
newdeleteC++表達(dá)式不可
::operator new()::operator delete()C++函數(shù)
allocator::allocate()allocator::deallocate()C++標(biāo)準(zhǔn)庫可自由設(shè)計搭配容器

new 和 delete

C/C++中的new和delete的實現(xiàn)過程

operator new():第一個參數(shù)表示大小,第二個參數(shù)表示保證這個函數(shù)不拋出異常。

注意:構(gòu)造函數(shù)不能直接調(diào)用,而析構(gòu)函數(shù)可以直接調(diào)用。

new[] 與 delete[] 要搭配使用,未搭配使用可能會內(nèi)存泄漏,泄露的是指針?biāo)赶虻牡胤健?/p>

析構(gòu)的時候次序會逆反。

對于 析構(gòu)函數(shù) 沒有意義,new[] 是否對應(yīng) delete[] 不重要,但是 當(dāng)析構(gòu)函數(shù)有意義時,必須對應(yīng)。

placement new

placement new 允許我們將對象建構(gòu)在一個已經(jīng)分配的內(nèi)存中。并且沒有對應(yīng)的placement delete。

第一部分,本來是分配內(nèi)存,現(xiàn)在已經(jīng)分配好了,所以直接返回。

重載 operator new

::operator new 和::operator delete 全部可以重載,但是不推薦。類中 operator new 也可以重載,實現(xiàn)所需功能,這是最常用的。

class Foo{
public:
	void *operator new(size_t);
	void operator delete(void*,size_t);
	//....
};

注意,可以寫出多個版本,前提是每一個版本的聲明都必須有獨特的參數(shù)列。(第一參數(shù)必須是size_t)只有new所調(diào)用的ctor 拋出異常,才會調(diào)用這些重載版的 operator delete()。

即使 operator delete() 未能一一對應(yīng)operator new() 也不會出現(xiàn)任何報錯。換句話說:放棄處理構(gòu)造函數(shù)拋出的異常。

per-class allocator

一:

想利用類內(nèi)重載operator new去接管內(nèi)存的分配,然后利用內(nèi)存池的觀念【即創(chuàng)建出一大段連續(xù)空間的內(nèi)存,然后將其切割成一小段一小段】,將創(chuàng)建的元素對象放在內(nèi)存池切分好的各分段小內(nèi)存片中,這樣避免了多次調(diào)用new而造成生成多個帶有cookie的內(nèi)存空間。通過內(nèi)存池的觀念,可以生成一大段只帶有兩個頭尾cookie的內(nèi)存空間,而該一大段內(nèi)存空間又被切分成每一小段的內(nèi)存空間,且其中的每一小段內(nèi)存空間片都可以共享這一整體的cookie信息。

因為為了能將一大段內(nèi)存空間切分成一小段一小段,然后通過單向鏈表的形式串接起來,所以必須多引入一個Screen* next指針。但這又會增加class Screen的大小【增加了4字節(jié)】。

二:第一個占用了一個指針,浪費(fèi)空間

這個版本通過union關(guān)鍵字來減少使用next而所占耗的內(nèi)存!

注意:上面兩個版本的operator delete操作都沒有將內(nèi)存空間回收還回給系統(tǒng),而是仍然存在的。雖然operator delete操作沒有將這些分配的內(nèi)存空間釋放掉,但其仍在控制中即仍可繼續(xù)重新使用【只不過freeStore或headOfFreeList此時又重新跑回整個一大塊內(nèi)存空間的頭端】,所以不算內(nèi)存泄漏!

三:上面的版本不具有復(fù)用性

將分配特定尺寸區(qū)塊的memory allocator包裝成一個class allocator,這樣每個allocator object都是個分配器,體內(nèi)維護(hù)一個free lists,不同類(如下面的class Foo,class Goo等) 里面調(diào)用生成的各自allocator objects維護(hù)不同的free lists。

由上知,class Foo或class Goo其operator new或operator delete最終調(diào)用的都是allocator object所維護(hù)的free list而進(jìn)行操作的!

另外,class Foo或class Goo中,應(yīng)注意到:

static allocator myAlloc,即myAlloc必須是個靜態(tài)成員變量,且在類外定義(賦初值)。如果其不是靜態(tài)成員變量時,則在構(gòu)建class Foo類對象時,是沒辦法調(diào)用到myAlloc的。因為非靜態(tài)成員變量只能通過對象調(diào)用【但此時Foo對象還沒生成又如何調(diào)用??!】。而myAlloc又是用來生成Foo類對象的,所以得通過類名調(diào)用即應(yīng)設(shè)置為static類型。

而class allocator的如下:

class allocator{
private:
	struct obj{
		struct obj* next;
	};
public:
	static void* allocate(size_t);
	static void deallocate(void*, size_t);
private:
	obj* freeStore = nullptr;
	const int CHUNK = 5; // 標(biāo)準(zhǔn)庫一般設(shè)置為20
};
void* allocator::allocate(size_t size){
	obj* p;
	if(!freeStore){
		// linked list為空,則申請一大塊
		size_t chunk = CHUNK * size;
		freeStore = p =(obj*)malloc(chunk); // 這里直接調(diào)用malloc進(jìn)行分配空間
		// 將分配的一大塊切分成5小段,并串接起來
		for(int i = 0; i < (CHUNK - 1); ++i){
			p->next = (obj*)((char*)p + size);
			p = p->next;
			// 上面這兩步相當(dāng)于p->next = p + 1,
			// 只不過這里需要適應(yīng)不同的類下的操作,因而設(shè)置成這種形式??!
		}
		p->next = nullptr; // 最后一小段的下一個位置指向空
	}
	p = freeStore;
	freeStore = freeStore->next;
	return p;
}
void allocator::deallocate(void* p, size_t){
	// 將要刪除的*p的位置調(diào)整為free list的頭端
	((obj*)p)->next = freeStore;
	freeStore = (obj*)p;
}

四、macro for static allocator(per-class allocator 4)

由第三版本知,其黃色部分我們想將其定義為宏操作,進(jìn)一步簡化代碼內(nèi)容:

// DECLARE_POOL_ALLOC  used in class definition
#define DECLARE_POOL_ALLOC()\
public:\
    void* operator new(size_t size){
        return myAlloc.cllocate(size);
    }\
    void operator delete(void* p){
        myAlloc.deallocate(p, 0);
    }\
protected:\
    static allocator myAlloc;

// IMPLEMENT_POOL_ALLOC   used in class implementation file
#define IMPLEMENT_POOL_ALLOC(class_name)\
    allocator class_name::myAlloc;

使用實例如圖所示:

在類內(nèi)進(jìn)行宏聲明,在類外進(jìn)行宏定義【告訴編譯器傳入?yún)?shù)的class type】

New Handler

=default,=delete

一個是需要默認(rèn)版本,另一個是這個函數(shù)我不要。

這兩個函數(shù)不僅使用構(gòu)造,同時適用于 operator new 和 operator delete。

到此這篇關(guān)于C++詳細(xì)講解內(nèi)存管理工具primitives的文章就介紹到這了,更多相關(guān)C++ primitives內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C語言break和continue的語句用法

    C語言break和continue的語句用法

    這篇文章主要介紹了C語言break和continue的語句用法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-04-04
  • C++實現(xiàn)LeetCode(34.在有序數(shù)組中查找元素的第一個和最后一個位置)

    C++實現(xiàn)LeetCode(34.在有序數(shù)組中查找元素的第一個和最后一個位置)

    這篇文章主要介紹了C++實現(xiàn)LeetCode(34.在有序數(shù)組中查找元素的第一個和最后一個位置),本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C++實現(xiàn)教職工信息管理系統(tǒng)

    C++實現(xiàn)教職工信息管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C++實現(xiàn)教職工信息管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • 詳解C語言處理算經(jīng)中著名問題百錢百雞

    詳解C語言處理算經(jīng)中著名問題百錢百雞

    古代的很多數(shù)學(xué)問題都可以用現(xiàn)代的編程語言去嘗試解決,就如本篇,將會帶你通過C語言來解決算經(jīng)中百錢百雞問題,感興趣的朋友來看看吧
    2022-02-02
  • C++調(diào)用libcurl開源庫實現(xiàn)郵件的發(fā)送功能流程詳解

    C++調(diào)用libcurl開源庫實現(xiàn)郵件的發(fā)送功能流程詳解

    libcurl是一個免費(fèi)開源的網(wǎng)絡(luò)傳輸庫,支持ftp、ftps、tftp,http、https、telnet、ldap、pop3、smtp等多種協(xié)議,接下來讓我們一起來了解吧
    2021-11-11
  • 如何在Qt中實現(xiàn)關(guān)于Json?的操作

    如何在Qt中實現(xiàn)關(guān)于Json?的操作

    JSON是一種輕量級數(shù)據(jù)交換格式,常用于客戶端和服務(wù)端的數(shù)據(jù)交互,不依賴于編程語言,在很多編程語言中都可以使用JSON,這篇文章主要介紹了在Qt中實現(xiàn)關(guān)于Json的操作,需要的朋友可以參考下
    2023-08-08
  • Qt 智能指針QScopedPoint用法小結(jié)

    Qt 智能指針QScopedPoint用法小結(jié)

    智能指針是C++11引入的一種指針封裝類型,用于自動管理動態(tài)分配的內(nèi)存,本文主要介紹了Qt 智能指針QScopedPoint用法小結(jié),感興趣的可以了解一下
    2024-01-01
  • 使用C++的string實現(xiàn)高精度加法運(yùn)算的實例代碼

    使用C++的string實現(xiàn)高精度加法運(yùn)算的實例代碼

    下面小編就為大家?guī)硪黄褂肅++的string實現(xiàn)高精度加法運(yùn)算的實例代碼。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-09-09
  • c++ 預(yù)處理之正整型實現(xiàn)方法

    c++ 預(yù)處理之正整型實現(xiàn)方法

    這篇文章主要介紹了c++ 預(yù)處理之正整型實現(xiàn)方法,需要的朋友可以參考下
    2017-07-07
  • C++實現(xiàn)棧與分析棧的知識點

    C++實現(xiàn)棧與分析棧的知識點

    這篇文章主要介紹了C++實現(xiàn)棧與分析棧的知識點,棧(stack)是計算機(jī)中常用的一種線性數(shù)據(jù)結(jié)構(gòu),經(jīng)常有資料使用“操作受限”來形容棧,因為它的壓入棧和彈出棧操作只能在棧頂進(jìn)行,下文更多相關(guān)資料,需要的小伙伴可以參考一下
    2022-03-03

最新評論