關於C 類與動態記憶體分配中布局new操作符

2021-09-30 10:18:22 字數 928 閱讀 2577

const   int  buf  =   512  ;

class  justtesting

~ justtesting()  {}

public :

} ;int  main()

以上**片斷中,pc1和pc3為布局new操作符來分配記憶體,而pc2和pc4為常規new操作符來分配記憶體 。

對於常規new操作符分配的記憶體,可以直接使用:delete pc2; 這樣的語句操作來釋放記憶體。

而對於布局new操作符分配的記憶體就不能這樣做:delete pc1;

因為pc1和pc3並沒有直接收到new操作符返回的位址,而是由布局操作符指向了buffer的位址,new/delete系統知道已分配的512位元組塊buffer,但對布局new操作符對該記憶體塊做了何種處理一無所知。

另一方面,buffer的位址是用new 初始化的,因此必須使用delete而不是delete。

注意:即使buffer是使用new而不是new初始化的,delete pc1 也將釋放buffer,而不是pc1。

以上的**確實釋放了buffer:delete buffer;

但是由此產生了新的問題,它沒有為布局new操作符在該記憶體塊中建立的物件呼叫析構函式,我們只需要在析構函式中放入一段顯示語句就可以清楚的看到,程式並沒有銷毀「justtesting」和「bad idea」,也就是pc1和pc3指向的物件。

那麼這裡就需要我們顯式的為布局new操作符建立的物件呼叫析構函式。正常情況下將自動呼叫析構函式,這是需要顯示呼叫析構函式的少數幾種情況之一。

顯式呼叫析構函式時,必須指定要銷毀的物件。由於有指向物件的指標,因此可以這樣寫:

pc3->~justtesting();

pc1->~justtesting();

把這段**放到delete buffer;之前,這段程式才算完整無錯。

摘自:

c語言動態記憶體分配 C 動態記憶體分配

動態記憶體分配 雖然通過陣列就可以對大量的資料和物件進行有效地管理,但是很多情況下,在程式執行之前,我們並不能確切地知道陣列中會有多少個元素。這種情況下,如果陣列宣告過大,就會造成浪費 宣告過小,就會影響處理。在c 中,動態記憶體分配技術可以保證程式在執行過程中按照需要申請適量記憶體,使用後釋放,從...

關於動態記憶體分配

動態記憶體分配方式在很多場合下有著重要的意義。動態分配使得記憶體的利用效率大大提高,在一些記憶體受限的情況下顯得極為重要。但是動態分配會帶來乙個問題,如何釋放。這個問題的關鍵就是,在釋放的時候,如何獲知這塊需要釋放的記憶體空間是多少位元組的。在文中,筆者談到new malloc 等方式動態分配的記憶...

類與動態記憶體分配總結

我們最好的策略是在程式執行時,而不是編譯時確定分配的記憶體,乙個很簡單的道理是我們很難精準 所需記憶體的大小,因而很容易導致浪費。答案是使用new和delete操作符。前文中我們使用其他方法宣告物件,析構函式是自動的,我們也無需擔心太多。但是如果在物件中用new動態宣告了變數,我們就必須在析構函式中...