【问题标题】:Calling virtual method from virtual destructor in C++ [duplicate]从C ++中的虚拟析构函数调用虚拟方法[重复]
【发布时间】:2017-08-13 06:24:40
【问题描述】:

我想破坏 B 类的对象。

class A {
public:
    A() {
        std::cout << "construct A" << av::endl;
        a = new int;
    }
    virtual ~A() {
        std::cout << "destruct A" << av::endl;
        this->clear();
    }
    virtual void clear() {
        std::cout << "clear A" << av::endl;
        delete a;
    }
protected:
    int *a;
};

class B : public A {
public:
    B() {
        std::cout << "construct B" << av::endl;
        b = new int;
    }
    ~B() {
        std::cout << "destruct B" << av::endl;
    }
    void clear() override {
        std::cout << "clear B" << av::endl;
        delete b;
        delete this->a;
    }
private:
    int *b;
};

我希望使用clear() 方法来完成。但是当我执行以下代码时:

A *a = new B();
delete a;

我明白了:

构造 A 构造 B 破坏 B 破坏 A 清除 A

而且clear B 永远不会被打印出来。 我做错了什么?

【问题讨论】:

    标签: c++ memory-management memory-leaks destructor


    【解决方案1】:

    非正式地,在~A(); 中,B 部分已经被销毁,调用 B 的任何函数都没有任何意义。


    有效的 C++ 第 9 条:在构造或销毁期间切勿调用虚函数。

    一旦派生类析构函数运行,对象的派生类 数据成员假定未定义的值,因此 C++ 将它们视为没有 不再存在。在进入基类析构函数时,对象 成为基类对象,以及 C++ 的所有部分——虚函数, dynamic_cast 等等,——这样对待它。

    【讨论】:

    • 谢谢你提到“Effective C++”,我想是时候再跑一遍了。
    猜你喜欢
    • 2012-09-21
    • 2016-08-14
    • 1970-01-01
    • 2017-01-27
    • 2012-04-18
    • 2020-07-06
    • 2015-12-30
    • 2011-08-12
    • 2015-09-29
    相关资源
    最近更新 更多