我失去控制,无法调试

时间:2013-05-18 15:52:59

标签: c++ destructor friend

class Base
{
private:
    int nID;
    friend int fnDeleteBase(Base*  base);
public: 
    Base( int baseID):nID(baseID) { cout << "Base Constructed with value" << endl; }
    Base () : nID(5){cout << "Base Constructed WITHOUT value" << endl; }
    ~Base() { cout << "Base class object killed " << endl; }
};

int fnDeleteBase(Base* base)                           // Line 1
{
    delete base;                                       // Line 2 - important
    cout << "Base object deleted " << endl; 
    return (1);
}

int main()
{
    Base aBase;                                        // Line 3 
    try
    {
        int i = fnDeleteBase(&aBase);                  // Line 4 
    }
    catch(...)
    {
        cout << "Exception handled " << endl;
    }

    return (0);
}

我正在调试上面的代码片段。我无法进入第2行,我将删除基础对象。一旦我尝试进入或跳过第2行,控制就会开始,我必须终止调试或执行

我得到的输出是:

Base Constructed (any of the construction is valid) 
Base class Object killed

但是,如果第3行更改为Base * aBase = new Base();,一切正常。控制台上的输出是:

Base Constructed (any of the construction is valid) 
Base class Object killed 
Base object Deleted

有人可以分享两者背后的技术细节吗?

1 个答案:

答案 0 :(得分:4)

你应该 对使用delete构建的指针(或指向使用new构建的其他指针的指针)使用new,没有例外(我知道)。

在其他任何事情上使用delete(在第一种情况下会发生这种情况,因为fnDeleteBase的参数是指向Base aBase的指针,它不是指针而且没有指针new关键字导致未定义的行为。

解释编译器究竟做了什么并不会有用,因为对于未定义的行为,这可能因编译器而异。应该不惜一切代价避免它。