小白剛剛開始學c++,求助一下:把問題的再具體一點就是:指標是依靠什么來判斷我應該釋放多大的空間的?
class A {
int a = 20;
};
class B :public A {
int b = 30;
};
int main()
{
cout << "------------------" << endl;
for (int i = 0; i <= 10000; ++i) {
B *pr = new B;
A *pt = pr;//使用一個父類的指標指向子類物件!
cout << "物件b的空間大小" << sizeof(*pr) << endl;
cout << "指標所指向的可訪問空間大小:" << sizeof(*pt) << endl;//父類指標管理的空間只有4,也就是類A的a變數屬性
delete pt;//使用父類的指標釋放,是否會造成記憶體泄露?
}
return 0;
}
//pt指標是否能把子物件釋放干凈?指標釋放的機制是什么?
uj5u.com熱心網友回復:
寫個解構式,在解構式中輸出一個資訊你就知道了uj5u.com熱心網友回復:
A加一個virtual 解構式,b加一個解構式uj5u.com熱心網友回復:
只要是堆上new 或者 malloc出來的指標,釋放它時系統自然知道它的大小。這個不用程式員操心。寫解構式的原因是,如果這個類內部有個指標,比如
class T{
char* str
};
T t1;
那么在你delete t1時,他不會自動釋放str;需要在解構式中釋放。而delete 其實是兩步,1,呼叫解構式,2釋放t1的記憶體。
再說解構式
如果一個類A ,再寫一個類B繼承于A
在B的解構式中,他會自動呼叫A的解構式。這個是C++編譯器自動添加的。
回到你的問題,如果A的指標,指向一個B的物件則,當你delete 這個指標時,他不會呼叫B的解構式,所以要把A的解構式設定為virtual.
因為他是virtual的所以函式虛表解構式的指向實際B的解構式,當你delete 時候,會自動呼叫B的解構式,而在B解構式中編譯器會自動加一條,A::~A(),進而洗掉了A的資源。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/61612.html
標籤:新手樂園
上一篇:大佬們,求一個英文版的VC6.0
下一篇:VS中莫名其妙的錯誤
