c++ - 我打电话给删除,但我的 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
解决方案
当我编译你的代码时,clang 抱怨说 Holder 的 dtor 试图删除一个>不完整的类型(TrueObject)。您是否尝试过在拥有 TrueObject 的完整声明(而不仅仅是前向声明)之后移动 Holder 的 dtor 的定义?
修复它解决了这个问题。谢谢!
推荐阅读
- eclipse - Eclipse 显示垃圾文件名
- laravel - 在不同目录的另一个刀片中预览刀片
- matlab - Dymola 模拟的 .mat 结果的数据处理
- nestjs - Nest 无法解析 JwtStrategy 的依赖关系
- xbox - Xbox Live Creators Program 能否授予对用于 Web 开发的 XBL RESTful API 的访问权限?
- vb.net - 在 Visual Basic 2019 中,如何设置已发布项目的安装目录?
- amazon-web-services - AWS cli 在账户之间切换
- azure - 从 WINdows 更改为 Linux App 服务计划后,域名未解析
- validation - 如何使用键值在 Mule4 中编写自定义策略,以验证每个传入的标头请求
- azure-data-lake - Azure Datalake Analytics U-SQL 与 Azure Datalake Storage Gen 2