關於C++中虛解構函式的一些問題——未載入 wntdll.padb

驀然雪化 且靜候發表於2020-11-28

關於C++中虛解構函式的一些問題

對於虛解構函式的問題,在《C++物件導向程式設計》教材書上只是簡單的提了一下,也就是P176頁中。

我們知道虛解構函式的出現和多型性有一定的關係,即為了實現功能的晚繫結,能在基類派生的子類中可以充分釋放基類中的成員,但是在使用多型性時,導致子類中的構析函式無法被呼叫

A a = new B();
delete a;

以上程式碼中只能使用A類中的構析函式,對於B類中新增的成員卻無法實現釋放。這個時候就需要將基類中的構析函式定義為虛解構函式(virtual標識)

class A {
	virtual ~A(){ cout<<"A::~A"<<endl;}
}
class B public A {
	~B(){ cout<<"B::~B"<<endl;}
}
········
int main(){
	·······
	A a = new B();
	delete a;
}

在此段程式碼的中輸出結果為:
B::~B
A::~A
從結果可以知道,系統會首先呼叫派生類的解構函式,再呼叫基類的解構函式,這樣兩個物件中的成員均可以得到相應解構函式釋放
舒暢的感覺,再也不便祕了

但是問題來了,對於單個物件多型性這樣釋放是沒有問題,放到一個基類的陣列指標也可以行得通嗎?

····
	A *a[2] = {NULL};
	a[0] = new B();
	a[1] = new B();
//	delete[] a;   	//錯誤!
	for(int i = 0;i < 2;i++){
		delete a[i];
		a[i] = NULL;
	}		//釋放成功!
····

在定義物件陣列指標時有點可以注意的時必須讓指標指向NULL,同時因為是陣列,需要使用“{ }”
在這裡插入圖片描述
對於使用第一種錯誤釋放方法就是上圖錯誤啦,至於問題所在以後再去了解了,問題大致是記憶體空間問題吧,無法有序的釋放一個陣列指標,必須要是使用一個迴圈來釋放,最好釋放後吧指標指向NULL以免產生其他問題,養成好習慣。

最後小聲逼一句,C++沒有垃圾回收機制,導致開發時各種關於記憶體的報錯,Java有GC垃圾回收機制,導致程式執行臃腫,但是對於新手入門友好,C++更加規範開發者開發習慣

相關文章