Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++中虚析构函数调用虚方法_C++_Memory Management_Memory Leaks_Destructor - Fatal编程技术网

C++中虚析构函数调用虚方法

C++中虚析构函数调用虚方法,c++,memory-management,memory-leaks,destructor,C++,Memory Management,Memory Leaks,Destructor,我想破坏一个B类的对象 我得到: 构造A构造B破坏B破坏A清除A 清晰的B永远不会被打印出来。 我做错了什么?非正式地,在~A;B部分已经被销毁,调用B的任何函数都没有任何意义 有效C++项目9:在构造或破坏过程中不调用虚函数。< /P> 一旦派生类析构函数运行,对象的派生类 数据成员假设未定义的值,因此C++将它们视为无 不再存在。在进入基类析构函数时,对象 成为一个基类对象,以及C++函数的所有部分, 动态施法等等-那样对待它 非正式地,在~A;B部分已经被销毁,调用B的任何函数都没有任何意

我想破坏一个B类的对象

我得到:

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

清晰的B永远不会被打印出来。 我做错了什么?

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

<>有效C++项目9:在构造或破坏过程中不调用虚函数。< /P> 一旦派生类析构函数运行,对象的派生类 数据成员假设未定义的值,因此C++将它们视为无 不再存在。在进入基类析构函数时,对象 成为一个基类对象,以及C++函数的所有部分, 动态施法等等-那样对待它

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

<>有效C++项目9:在构造或破坏过程中不调用虚函数。< /P> 一旦派生类析构函数运行,对象的派生类 数据成员假设未定义的值,因此C++将它们视为无 不再存在。在进入基类析构函数时,对象 成为一个基类对象,以及C++函数的所有部分, 动态施法等等-那样对待它


谢谢提到有效的C++,我想是时候让我重新运行它了。谢谢提到有效C++,我想是时候让我再运行一遍了。
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;
};
A *a = new B();
delete a;