關於C++中虛解構函式的一些問題——未載入 wntdll.padb
關於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++更加規範開發者開發習慣
相關文章
- 關於C++中建構函式的常見疑問C++函式
- 關於cuda中的函式問題函式
- 關於php解構函式的一個有趣問題PHP函式
- C/C++—— C++中定義虛解構函式的原因C++函式
- C++的虛解構函式的作用C++函式
- 關於虛擬函式的一些理解函式
- 虛解構函式(√)、純虛解構函式(√)、虛建構函式(X)函式
- 關於C#中建構函式的繼承的問題C#函式繼承
- 關於Python中函式過載問題的思考(原創)Python函式
- C++箴言:避免解構函式呼叫虛擬函式C++箴言函式
- 關於建構函式與解構函式的分享函式
- 關於Swift中的泛函式find的問題Swift函式
- [cpp]C++中的解構函式C++函式
- 關於scanf函式的問題函式
- 關於函式索引的問題?函式索引
- 關於C++當中的“模板函式”C++函式
- C/C++—— C++中建構函式不能是虛擬函式的原因分析C++函式
- Effective c++(筆記) 中關於建構函式、解構函式以及賦值操作符的知識C++筆記函式賦值
- 關於解決博弈論問題的SG函式函式
- 關於preg_replace函式的問題講解函式
- C++ 中的虛擬函式C++函式
- C++ 虛解構函式簡單測試C++函式
- C++中的虛擬函式與虛擬函式表 (轉)C++函式
- 虛解構函式的作用函式
- 關於延遲載入,立即載入的問題
- C++之類解構函式為什麼是虛擬函式C++函式
- C++中虛擬函式的作用C++函式
- 關於“建構函式”中的幾個小問題,也許面試會問到哦~函式面試
- 關於python建構函式的過載Python函式
- 關於scala中的主建構函式函式
- 詳解C++中的多型和虛擬函式C++多型函式
- 關於類的建構函式不能為虛擬函式的幾點理由!函式
- C++ 派生類函式過載與虛擬函式繼承詳解C++函式繼承
- C++虛擬函式解析(轉載)C++函式
- C++中建構函式,拷貝建構函式和賦值函式的詳解C++函式賦值
- C++解構函式C++函式
- C++中抽象類、虛擬函式和純虛擬函式C++抽象函式
- c++ 虛解構函式[避免記憶體洩漏]C++函式記憶體