2017-04-13 61 views
0

正如我已經讀過,如果我們通過指針創建對象,它不會自動刪除。但是,當我打電話成員函數指針它給錯誤面向調用指針的成員函數的錯誤

#include <iostream> 
using namespace std; 

class Base 
{ 
protected: 
    int i; 
public: 
    Base(){} 
    Base(int a)  { i = a; } 
    virtual void display() 
    { cout << "I am Base class object, i = " << i << endl; } 
    ~Base(){ 
     cout<<"tsp"; 
    } 
}; 

int main() 
{ 
    //Base b(33); 
    { 
    Base *u=new Base() ; 
    } 
    u->display(); 
    //delete u; 
    return 0; 
} 

O/P:「U」不是在這個範圍內聲明,但仍存儲在內存

+0

如果我刪除範圍,它調用函數 –

+2

變量'u'和您分配'new'的對象是獨立存在的事物。 – molbdnilo

回答

2

指針不被刪除,但u當它聲明的塊結束時超出範圍; u僅在該塊中可用。因此,調用u->display()是錯誤的,因爲範圍中不再有u變量。

注意,因爲它不會自動刪除(走出去的範圍同樣的事情被刪除),你都滲出由Base對象分配內存。

換一種方式,u指向一個Base對象,但它本身並不是目的。指針可以消失,但該對象仍然可以存在。就好像我有人把名片扔了一樣。他們的電話號碼或電子郵件地址不會因爲我扔掉了我的記錄而停止存在。

u超出範圍」丟掉名片。

delete u」是...斷開名片上的電話線,我想。

對比度此用下面的代碼,使用一個智能指針:

int main() { 
    std::cout << "top\n"; 

    { 
     std::unique_ptr<Base> u{new Base()}; 
    } 

    std::cout << "bottom\n"; 
} 

在這種情況下,當u超出範圍,智能指針將被破壞並且Base分配被釋放(在看到輸出bottom之前,您將看到輸出tsp)。

+0

因此,如果我將使用智能指針,那麼我不需要刪除在新的基地() –

+0

@TUHINSUBHRAPANDA期間創建的內存正確,智能指針會爲你刪除它。每個智能指針類型('unique_ptr','shared_ptr'等)具有刪除底層對象的不同條件,並且可以用於不同情況下(例如'unique_ptr's不能被複制,但'shared_ptr's可以)。 – cdhowie

相關問題