我叫删除,但我的d-tor没有叫,为什么?

i call delete, but my d-tor isn't called, why?

本文关键字:为什么 d-tor 删除 我的 我叫      更新时间:2023-10-16

我写了这段代码(我知道这是一个糟糕的设计,但这只是我正在使用的代码中真实对象的简化模拟,试图检查一些与内存相关的错误(,当使用调试器运行时,我可以到达 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

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

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