2016-04-03 190 views
1

我想實例化一個對象並在之後刪除它,我做錯了什麼?實例化並刪除一個對象C++

default: 
     //Instantiate object of the ErrorHandler class 
     errPtr = new ErrorHandler(); 
     //Print the error message to the console screen 
     errPtr->showError("Invalid input, please select option 1 or 2, and press enter."); 
     delete errPtr; 
     errPtr->showError("hello"); //This line is being executed normally like object still exist. 
     break; 

我的問題是我怎麼能調用showError();方法刪除它的對象?

+0

@SteJ這就是沒有任何錯誤的地步,我的問題是,如何在刪除對象後成功調用showError方法? –

+0

我發現了評論,對不起。我的答案如下。 – SteJ

+0

如果成員函數'showError'從不使用'ErrorHandler'中的成員數據,那麼'this'將從解除分配的'errPtr'中被取消引用。這仍然是未定義的行爲,但是因爲你的糟糕的'this'永遠不會被解除引用,所以這種非靜態成員函數更像靜態。 –

回答

3

實例化和刪除的方式並沒有什麼錯 - 發生的是內存分配的方式(或者在這種情況下更合適的解除分配)。

當你在堆內存中使用free()delete)時,它會將其標記爲可用 - 它不會清除指針或它用來指向的內存;這樣做會降低性能,特別是如果您的對象非常大。一切都保持完好無損,直到別的東西使用它。

因爲在delete之後直接使用errPtr,該對象仍在內存中。

C++不會阻止你在被刪除後使用指針,但是這樣做是一個非常糟糕的主意,因爲你的指針現在指向可能被別的東西使用的內存。

基本上你在做什麼錯在這裏是使用指針後,它指向的內存被釋放。一旦你刪除了你的對象,你可以不參考它 - 你必須相信內存現在是免費的,一旦你呼叫delete

4
errPtr->showError("hello"); //This line is being executed normally like object still exist. 

雖然這只是未定義的行爲。

如果您取消引用之前爲delete d的指針,包括看似正確的行爲,則可能會發生任何情況。