亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

delete刪除對象?

delete刪除對象?

眼眸繁星 2019-02-12 14:10:36
#include<iostream>using namespace std;class A {public:A(){}};class B:public A{public:B(){}};int main(){B* pB=new B();A* pA=pB;delete pA;return 0;}請問這個delete能正確刪除B對象嗎,說明一下,謝謝class A {public:A(){a=0;}int a;};class B:public A{public:B(){b=0;}int b;};若改為這樣,是不是delete就不能正常刪除B對象了?
查看完整描述

2 回答

?
qq_遁去的一_1

TA貢獻1725條經驗 獲得超8個贊

按照你寫的代碼,是能正常刪除對象的,你在看C++的時候,要理解一個對稱與職責的原則:

只要是系統(編譯系統或運行時系統)做的事,系統一定會保證對它進行正確的收尾.程序員只需對自己做的事負責...

是什么意思呢?你看,在你的代碼中,無論是int a,還是int b,構造函數只是負責為它們賦初值而已,它們的內存實際上是在定義時由系統負責為你分配的.當你調用new 分配一個由B對象時(先不管它由什么指針指向).系統保證按照你所定義的類結構,首先為基類A進行內存布局,并調用構造函數初始化a.然后為自身擴展的類成員進行內存布局,并初始化b...
當你后來通過delete通過基類指針來刪除對象時,系統會按照與它以前進行內存布局相反的順序,釋放a,b占有的內存(這就滿足了一個對稱和職責的原則)...
當然,由于你的析構是非虛的,所以delete *pa不會調用B的析構函數(這里是默認析構函數)...但要清楚,構造函數和析構函數的作用僅是對程序員自身在堆上直接分配內存有關聯,與系統內存布局的默認行為關聯不大.這一點在你程序中并不成問題,因為你的類成員中并沒有使用new來直接分配內存的代碼...

查看完整回答
反對 回復 2019-03-22
  • 2 回答
  • 0 關注
  • 993 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號