如何讓new 操作 不分配記憶體 只呼叫建構函式

2021-09-08 03:19:32 字數 2713 閱讀 9788

沒有記憶體池的時候,你只是用new直接建立了乙個物件,但是new的過程分為兩步,首先是分配記憶體,然後是呼叫建構函式。

記憶體池就只是負責記憶體的分配,有了記憶體池後,你再去建立物件時候,只需要先從記憶體池中取出記憶體,然後再在取出的記憶體上呼叫物件的建構函式,產生你需要的物件

如何讓new操作符不分配記憶體,只呼叫建構函式 

問題:c++中的new操作符 通常完成兩個工作 分配記憶體及呼叫相應的構造出世核函式。

請問:1)如何讓new操作符不分配記憶體,只呼叫建構函式?

2) 這樣的用法有什麼用?

解答:(要求new顯式呼叫建構函式,但不分配記憶體。)

題目要求不能生成記憶體 還要呼叫建構函式 說明這個類裡面沒有對內部操作 但可以對外部操作 比如static的數

摘錄:如果我是用new分配物件的,可以顯式呼叫析構函式嗎?

可能不行。除非你使用定位放置 new.

class fred

}; int main()

其中這個10000可以是任意數,但不能為0

2)定位放置new(placement new)有很多作用。最簡單的用處就是將物件放置在記憶體中的特殊位置。這是依靠 new表示式部分的指標引數的位置來完成的:

#include // 必須 #include 這個,才能使用 "placement new"

#include "fred.h"     // class fred 的宣告

void somecode()

line #1 在記憶體中建立了乙個sizeof(fred)位元組大小的陣列,足夠放下 fred 物件。line #2 建立了乙個指向這塊記憶體的首位元組的place指標(有經驗的 c 程式設計師會注意到這一步是多餘的,這兒只是為了使**更明顯)。line #3 本質上只是呼叫了建構函式 fred::fred()。fred建構函式中的this指標將等於place。因此返回的 f 將等於place。   

line #3 本質上只是呼叫了建構函式 fred::fred()。

placement new的作用就是:建立物件但是不分配記憶體,而是在已有的記憶體塊上面建立物件。

用於需要反覆建立並刪除的物件上,可以降低分配釋放記憶體的效能消耗。

#include

#include

const intchunk = 16;

class foo

foo( )

private :

int_val;

};//預分配記憶體,但沒有foo物件

char*buf = new char[ sizeof(foo) * chunk ];

intmain( void )

//模擬建構函式的功能 

~obj(void)                         //模擬析構函式的功能 

void      initialize(void) 

void      destroy(void) 

}; 

void usemallocfree(void) 

void usenewdelete(void) 

示例用malloc/free和new/delete如何實現物件的動態記憶體管理: 

類obj的函式initialize模擬了建構函式的功能,函式destroy模擬了析構函式的功能。函式usemallocfree中,由於malloc/free不能執行建構函式與析構函式,必須呼叫成員函式initialize和destroy來完成初始化與清除工作。函式usenewdelete則簡單得多。 

所以我 們不要企圖用malloc/free來完成動態物件的記憶體管理,應該用new/delete

。由於內部資料型別的「物件」沒有構造與析構的過程,對它們而言malloc/free和new/delete是等價的。 

//即對於內建資料型別來說,二者是等價的(但是夢夢認為這個時候還是malloc/free的效率更好一點)。但是對於非內建資料型別,我們只能選擇new/delete 。 

既然new/delete的功能完全覆蓋了malloc/free,為什麼c++不把malloc/free淘汰出局呢? 

這是因為c++程式經常要呼叫c函式,而c程式只能用malloc/free管理動態記憶體。 

如果用free釋放「new建立的動態物件」,那麼該物件因無法執行析構函式而可能導致程式出錯。如果用delete釋放「malloc申請的動態記憶體」,理論上講程式不會出錯,但是該程式的可讀性很差。所以new/delete必須配對使用,malloc/free也一樣。 

//即出於相容性的考慮,c++裡保留了c語言的malloc/free函式 

二:new delete在實現上其實呼叫了malloc,free函式。 

三:new operator除了分配記憶體,還要呼叫建構函式。 

malloc函式只是負責分配記憶體。 

new 一維陣列 

***   *arr; 

int   len;     //   動態確定該長度值 

arr   =   new   ***[len];     //   動態分配,也可以使用   malloc 

... 

delete   arr;       //不要忘記釋放 

new 多維陣列    //話說這部分資料夢夢昨天找了一天,原來姐姐那裡有,汗

正確的做法是先宣告乙個n維陣列,每個單元是指向char(data_type)的指標,再分別對每個單元分配記憶體.**如下 

char **array=new char*[n]; 

for(int i=0;i

如何讓new操作符不分配記憶體,只呼叫建構函式

如何讓new操作符不分配記憶體,只呼叫建構函式 2009 11 19 18 37 如何讓new操作符不分配記憶體,只呼叫建構函式 收藏 問題 c 中的new操作符 通常完成兩個工作 分配記憶體及呼叫相應的構造出世核函式。請問 1 如何讓new操作符不分配記憶體,只呼叫建構函式?2 這樣的用法有什麼用...

如何讓new操作符不分配記憶體,只呼叫建構函式

問題 c 中的new操作符 通常完成兩個工作 分配記憶體及呼叫相應的構造出世核函式。請問 1 如何讓new操作符不分配記憶體,只呼叫建構函式?2 這樣的用法有什麼用?解答 要求new顯式呼叫建構函式,但不分配記憶體。題目要求不能生成記憶體 還要呼叫建構函式 說明這個類裡面沒有對內部操作 但可以對外部...

如何讓類物件只在棧(堆)上分配空間?

一般情況下,編寫乙個類,是可以在棧或者堆分配空間。但有些時候,你想編寫乙個只能在棧或者只能在堆上面分配空間的類。這能不能實現呢?仔細想想,其實也是可以滴。在c 中,類的物件建立分為兩種,一種是靜態建立,如a a 另一種是動態建立,如a ptr new a 這兩種方式是有區別的。1 靜態建立類物件 是...