cdelete命令的原理是什麼,C delete命令的原理是什麼?

2021-12-25 07:59:12 字數 3624 閱讀 8565

1樓:匿名使用者

關於這個問題。我前幾天剛好在 effective c++裡看到。

這種問題牽扯到 虛解構函式。

大概是這樣的:

比如a*p=new b;

。。。delete p;

如果父類的 解構函式不是一個虛擬函式 。那麼delete p這樣的行為是不可**的——無法知道將會發生什麼。

c++語言標準關於這個問題的闡述非常清楚:當通過基類的指標去刪除派生類的物件,而基類又沒有虛解構函式時,結果將是不可確定的(實際執行時經常發生的是,派生類的解構函式永遠不會被呼叫。)

為了避免這個問題,只需要使a的解構函式為virtual。宣告解構函式為虛就會帶來你所希望的執行良好的行為:物件記憶體釋放時,a和b的解構函式都會被呼叫。

關於第二個問題 delete p只是釋放指標指向的記憶體所儲存的資料,並不會改變指標所儲存的地址。因此執行完這個操作可以

設定p=null

我執行了delete p,cout<

2樓:正能量女戰神

c++ delete命令的原理如下:

delete也分為兩種情況:

1,簡單資料型別(包括基本資料型別和不需要解構函式的型別)。

[cpp] view plaincopy

int *p = new int(1);

delete p;

delete的彙編碼如下:

[cpp] view plaincopy

delete p;

00275314 mov eax,dword ptr [p]

00275317 mov dword ptr [ebp-0d4h],eax

0027531d mov ecx,dword ptr [ebp-0d4h]

00275323 push ecx

00275324 call operator delete (0271127h)

分析:傳入引數p之後呼叫operator delete,其原始碼如下:

[cpp] view plaincopy

void operator delete( void * p )

rtccallback預設是空的巨集定義,所以這個函式預設情況下就是簡單的呼叫free函式。

總結:delete簡單資料型別預設只是呼叫free函式。

2,複雜資料型別(需要由解構函式銷燬物件)

**例項:

[cpp] view plaincopy

class object

~object()

private:

int _val;

};void main()

部分彙編碼如下:

[cpp] view plaincopy

012241f0 mov dword ptr [this],ecx

012241f3 mov ecx,dword ptr [this]

012241f6 call object::~object (0122111dh) //先呼叫解構函式

012241fb mov eax,dword ptr [ebp+8]

012241fe and eax,1

01224201 je object::`scalar deleting destructor'+3fh (0122420fh)

01224203 mov eax,dword ptr [this]

01224206 push eax

01224207 call operator delete (01221145h)

0122420c add esp,4

總結:delete複雜資料型別先呼叫解構函式再呼叫operator delete。

3樓:匿名使用者

首先sizeof並不是萬能的,你用sizeof來看大小本來就是錯的,用錯的東西來解釋其它東西,結果肯定是錯的

c++中的delete的操作到底是怎麼回事??

4樓:匿名使用者

00399208 代表的是抄p這個指標指向的地址值,在delete之前輸出的那個5代表p這個指標指向的一個int空間裡面存放的數值;

在你delete之後,p這個指標沒有變化,仍然是00399208,但是它指向的空間已經被釋放了,所以輸出的就是一個「不確定」的數值:-57266307.

對於問題的補充:

2.如果在程式**後面再加上*p=5;cout<<*p<

可以再輸出一個5;注意已經使用了delete操作。

空間雖然釋放了,但那時p這個指標仍然是有效的,它指向的記憶體仍然是可寫的,所以程式會進行正確的輸出。

5樓:何處淬吳鉤

p是個指bai針,int *p=new int(5)使p指向新申請的du具有5個元素的整型陣列這zhi段內dao存,回用delete刪除後,這段記憶體已經被**答,而p沒有改變,仍指向這段記憶體,所以*p是個不確定的值。

1.*p不是一個不確定的值,執行結果總是-572662307。

這是因為p指向的記憶體是固定的,但這段記憶體並未被本程式使用,因此可能被作業系統分配給其他程式,若該段記憶體沒有被分配,則記憶體中的資料是不變的,也就是*p是固定的,另外,不同的編譯器也有不同的約定,有的編譯器會對不屬於本程式的記憶體固定的顯示一個錯誤值。

2.如果在程式**後面再加上*p=5;cout<<*p<

這等於為*p申請了記憶體,存放整型資料5,*p當然=5.

6樓:哀傷落葉

1.指標

baip裡的地址肯定是固定的.

這是因du為程式使用的內zhi存可分成4個部分dao(**區

版,靜態全域性變數區,棧區,堆區),你這裡是

權動態分配記憶體,使用的是堆區,堆裡面的可用空間不是連續的,系統裡面儲存了一個連結串列來放這些可用空間的地址,而你申請記憶體時,系統會從表頭開始檢索,遇到第一個滿足要求的,就把這個地址給你.

你在執行程式時系統找到那個地址給你,結束執行後你那塊記憶體又被還回去了

(delete p),你第二次在執行這個程式,系統還是那樣找,找到的當然還是那個地址.

2.這個結果是對的,但這麼做不好, 你最好在delete p;後加一句

p = null;然後就不要用p 了,我在說下為什麼會出現5

你 delete p;是釋放了p指向的那片記憶體,那麼p指向的內容就不確定了,而p 依然是一個指向int 的指標

而 *p = 5 是讓p指向字面常量5 的地址,5這個常量是直接存放在**區的,

所以之後你不能改變*p的值

7樓:

delete 是釋放new 操作佔用的記憶體,一般new 和delete 是連用的,不釋放記憶體會造成記憶體洩漏,釋放記憶體後 p就是一個無效指標,不能在其上做任何操作

8樓:匿名使用者

這樣操作是危險的!!delete 釋放掉new的空間,所以p所指的內容就釋放掉了。所以 *p是未知的!!!但p本身存放的東西沒有變,要到程式結束時被釋放

這個的原理是什麼,這個的原理是什麼?

木桶原理 cannikin law 木桶原理又稱短板理論,木桶短板管理理論。所謂 木桶理論 也即 木桶定律 其核心內容為 一隻木桶盛水的多少,並不取決於桶壁上最高的那塊木塊,而恰恰取決於桶壁上最短的那塊。根據這一核心內容,木桶理論 還有兩個推論 其一,只有桶壁上的所有木板都足夠高,那木桶才能盛滿水。...

藍芽傳輸的原理是什麼,藍芽是什麼原理

藍芽使用跳頻技術,將傳輸的資料分割成資料包,通過79個指定的藍芽頻道分別傳輸資料包。每個頻道的頻寬為1 mhz。藍芽4.0使用2 mhz 間距,可容納40個頻道。第一個頻道始於2402 mhz,每1 mhz一個頻道,至2480 mhz。有了適配跳頻 adaptive frequency hoppin...

空調的原理是什麼,空調工作原理是什麼

空調者空氣的調節,在家用空調中以把管路里的製冷液體壓縮後噴射,在盤管裡氣化吸熱,再在外機盤管裡冷卻變液體,再被製冷壓縮機吸回,完成一次迴圈,週二復始。熱力學稱為逆向卡諾迴圈。冬天,則反過來走,把液體倒流,先壓倒外機,在外面吸熱,到室內放熱,提高室內溫度,但制熱的效率比較低,所以往往加有電熱絲加熱。冷...