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