2017-04-13 44 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

相关问题