1
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

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

4

1 回答 1

4

您应该使用使用delete构造的new指针(或分配给使用构造的其他指针的指针new),没有例外(我知道)。

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

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

于 2013-05-18T16:11:50.447 回答