關於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中的函式問題函式
- 關於虛擬函式的一些理解函式
- 關於建構函式與解構函式的分享函式
- [cpp]C++中的解構函式C++函式
- 關於C++當中的“模板函式”C++函式
- C++ 虛解構函式簡單測試C++函式
- 關於python建構函式的過載Python函式
- C++之類解構函式為什麼是虛擬函式C++函式
- C++ 派生類函式過載與虛擬函式繼承詳解C++函式繼承
- 詳解C++中的多型和虛擬函式C++多型函式
- C++解構函式C++函式
- C++中建構函式,拷貝建構函式和賦值函式的詳解C++函式賦值
- 關於scala中的主建構函式函式
- [20190918]關於函式索引問題.txt函式索引
- c/c++ 拷貝控制 建構函式的問題C++函式
- C++入門記-建構函式和解構函式C++函式
- [持續更新]——關於C++的一些可能會常用的函式C++函式
- Leetcode刷題中關於java的一些小問題LeetCodeJava
- 118 C++中函式的過載C++函式
- C++建構函式和解構函式呼叫虛擬函式時使用靜態聯編C++函式
- 關於python3.7中 scipy模組輸出函式出錯問題的解決Python函式
- 關於C++中在模板引數中使用Lambda表示式的問題C++
- 關於input的一些問題解決方法分享
- 解決WPF中過載Window.OnRender函式失效問題函式
- 關於 Math.random 的一些函式random函式
- 關於Redis的一些小問題Redis
- 關於Java中分層中遇到的一些問題Java
- 關於onethink 目錄,檔案讀寫檢測函式中的問題函式
- 關於C++當中的指標懸空問題C++指標
- C++關於DLL中建立套接字的問題(求教)C++
- C++ 建構函式和解構函式C++函式
- 一些關於 SAP Spartacus 元件和模組延遲載入的問題和解答元件
- mysql練習 —— 關於一些函式的使用MySql函式
- C++入門教程(14):過載函式C++函式
- c++虛擬函式表C++函式
- (求教)關於js函式按值、引用傳遞的問題JS函式
- 關於使用toFixed()函式時報錯”toFixed() is not a function”的問題函式Function