首页 > 解决方案 > 我打电话给删除,但我的 d-tor 没有被调用,为什么?

问题描述

我写了这段代码(我知道这是一个糟糕的设计,但这只是我正在使用的代码中真实对象的简化模拟,试图检查一些与内存相关的错误),当使用调试器运行它时,我可以到达 Holder d-tor 中的“删除”,但从未调用 TrueObject 的 d-tor。这是为什么?(用vs2017编译)

#include "stdafx.h"
#include <iostream>
using namespace std;

class ComonBaseA {
public:
    ComonBaseA() { cout << "ComonBaseA" << endl; }
    virtual ~ComonBaseA() { cout << "~ComonBaseA"<<endl; }
};

class Proxy : public ComonBaseA {
public:
    Proxy() { cout << "Proxy" << endl; }
    void invoke();
    ~Proxy();
private:
    ComonBaseA* imp = nullptr;

};

class A : public Proxy {
public:
    A() { cout << "A with invoke" << endl; invoke();}
    A(bool bNoProxy) { cout << "A (empty)" << endl; }
    virtual ~A() { cout << "~A"<<endl; }
};

class TrueObject;

class Holder {
public:
    Holder() { cout << "Holder" << endl; }
    void hold(TrueObject* t) {
        cout << "holding" << endl;
        _t = t;
    }
    ~Holder() {
        cout << "~Holder" << endl;
        delete _t;

    }

private:
    TrueObject* _t = nullptr;
};

class TrueObject {
public:
    TrueObject(Holder* h) { 
        cout << "TrueObject" << endl;
        h->hold(this);
    }
    ~TrueObject() { 
        cout << "~TrueObject"<<endl; 
    }
};



class AImp : public A, public Holder {
public:
    AImp() : A(true), Holder() {
        cout << "AImp" << endl;
        _t = new TrueObject(this);
    }
    ~AImp() { cout << "~AImp"<<endl; }

private:
    TrueObject* _t = nullptr;
};


void Proxy::invoke() {
    imp = new AImp();
}

Proxy::~Proxy() {
    cout << "~Proxy"<<endl;
    delete imp;
}


int main()
{
    A a;
    return 0;
}


输出:

ComonBaseA
Proxy
A with invoke
ComonBaseA
Proxy
A (empty)
Holder
AImp
TrueObject
holding
~A
~Proxy
~AImp
~Holder
~A
~Proxy
~ComonBaseA
~ComonBaseA

标签: c++

解决方案


当我编译你的代码时,clang 抱怨说 Holder 的 dtor 试图删除一个>不完整的类型(TrueObject)。您是否尝试过在拥有 TrueObject 的完整声明(而不仅仅是前向声明)之后移动 Holder 的 dtor 的定义?

修复它解决了这个问题。谢谢!


推荐阅读