c++ - 我正在失去控制并且无法调试

标签 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

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

最佳答案

你应该使用delete在使用 new 构造的指针上(或分配给使用 new 构造的其他指针的指针),没有异常(exception)(据我所知)。

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

解释编译器到底做了什么并不会真正有帮助,因为对于未定义的行为,这可能因编译器而异。应该不惜一切代价避免这种情况。

关于c++ - 我正在失去控制并且无法调试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16626138/

相关文章:

c++ - 选择何时使用友元函数

c++ - C++模板类中使用友元函数操作私有(private)变量时出错

c++ - 使用 ostream 作为引用 (C++)

c++ - 矩阵类运算符重载、析构问题

c++ - 单例:为什么不需要删除并且看不到析构函数调试消息

python - python中的对象破坏

c++ - 在 C++11 标准的 §7.3.1.2/3 中有一些我不理解的细节

c++ - 析构函数抛出异常

C++ 无法将参数传递给 std::priority_queue 构造函数

c++ - 用于 C++ 的进程安全日志库