我叫删除,但我的d-tor没有叫,为什么?
i call delete, but my d-tor isn't called, why?
我写了这段代码(我知道这是一个糟糕的设计,但这只是我正在使用的代码中真实对象的简化模拟,试图检查一些与内存相关的错误(,当使用调试器运行时,我可以到达 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 的定义?
修复它解决了问题。谢谢!
相关文章:
- 为什么"do while"循环不断退出,即使条件计算结果为 false?
- 为什么在全局范围内使用"extern int a"似乎不行?
- 为什么在popback()操作之后,它仍然打印完整的矢量
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 为什么会发生堆损坏
- 为什么使用 "this" 指针调用派生成员函数?
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 为什么比较运算符如此快速
- 为什么 Serial.println(<char[]>);返回随机字符?
- 为什么这个运算符<重载函数对 STL 算法不可见?
- 为什么不;名字在地图上是按顺序排列的吗
- 我的字符计数代码计算错误.为什么
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 我叫删除,但我的d-tor没有叫,为什么?
- C++复制 c'tor 现在确实会采取行动。 不清楚为什么
- 为什么 std::runtime_error 的 c'tor 经常引用 std::string?
- 当一个结构有 C-Tor 时,为什么我不能静态初始化它?
- 为什么叫d'tor,尽管它不应该?
- 为什么我可以预编译父亲的 c'tor 而不是他的属性?.cpp