为什么我的破坏者只称呼一次,而不是在删除(a)调用上
Why is my destructor called only once and not on the delete(a) call?
using namespace std;
class A {};
class B {};
class C : public A {
public:
C(){ b = new B();}
B* b;
~C(){
printf("in destructorn");
delete b;
}
};
void doSomething(A&aref)
{
C c = (C &) aref;
c.b = new B();
int i;
}
int main()
{
A * a;
a = new C();
printf("Line 1n");
doSomething(*a);
printf("Line 2n");
delete(a);
return 0;
}
输出是:
Line 1
in destructor
Line 2
尝试删除delete(a)
并获得相同的结果。
为什么我看不到两次被命令的命令器?我希望在doSomething
函数的末尾和delete
调用。
为什么doSomething
函数称呼驱动器?为什么delete(a)
不会导致错误?
您缺少 A
中的 virtual
destructor,因此未定义的行为。默认一个用于定义的行为。
class A {
public:
virtual ~A() = default;
};
相关文章:
- 是否有C++编译器选项允许激进地删除所有函数调用,并将参数传递给具有空体的函数
- 为什么类中的ostringstream类型的成员会导致";调用隐含删除复制构造函数";错误
- 如何知道何时调用删除以及何时调用 delete[] C++?
- 在对象指针上调用 Delete 是否会递归删除其动态分配的成员
- 线程调用的函数对对象删除是否安全?
- 在运行时有条件地删除类成员或跳过调用该成员对象的构造函数
- 调用类模板中隐式删除的复制构造函数
- 编译器在C++中调用另一个函数时,在参数中查找已删除的构造函数
- C++ 在析构函数调用之前删除的动态成员数组
- 为什么为未删除的对象调用析构函数?
- 删除了在初始值设定项中调用的构造函数
- 在调用过程中删除 std::函数
- 防止我的向量在调用它的函数结束时被删除
- 除了调用全局删除运算符之外,删除一个void指针还能做什么呢
- 为什么这不是"调用隐式删除的'QQmlElement'的默认构造函数"中的默认构造函数
- 删除调用析构函数,但不删除对象
- 在 Visual C++ 中删除调用后检测到堆损坏
- 删除[]调用析构函数
- 在回调函数中安全地删除调用方对象
- 重新分配变量,删除调用了两次(C++)