在将已删除的指针分配给新对象时调用析构函数
Destructor getting called on assigning the deleted pointer to a new object
#include <iostream>
#include <cstdlib>
#include <string.h>
using namespace std;
class A {
public:
A () {cout<<" An";}
virtual ~A () {cout<<" ~An";}
};
class B : public A {
public:
B () :A() {cout<<" Bn";}
virtual ~B() {cout<<" ~Bn";}
};
int main (int, char *[]) {
A *ap = new B;
delete ap;
A b = *ap;
return 0;
}
输出为 :
A
B
~B
~A
为什么 A 的最后一个析构函数被调用为 A b = *ap为什么不在这里调用 A 的构造函数?
谢谢!!!
您遇到了未定义的行为,任何事情都可能发生。
调用delete ap;
后,取消引用它是非法的:
delete ap;
A b = *ap;
除此之外,您确实知道析构函数是按继承的相反顺序调用的,对吧?这意味着如果删除B
,基类析构函数~A
也会被调用。
另请注意,如果它是有效的(它不是),A b = *ap;
将调用编译器生成的复制构造函数,而不是您的构造函数。
相关文章:
- 什么时候调用组成单元对象的析构函数
- 使用基类指针创建对象时,缺少派生类析构函数
- 对具有动态分配的内存和析构函数的类对象的引用
- C++析构函数调用两次,堆栈分配的复合对象
- 如何从 Gtk::窗口调用派生对象的析构函数
- 为什么数组中对象的析构函数在被另一个对象替换时不被调用?
- 为什么为未删除的对象调用析构函数?
- 对象的构造函数和析构函数
- 循环中本地对象的析构函数是否保证在下一次迭代之前被调用?
- C++使用函数对象的线程,如何调用多个析构函数而不是构造函数?
- 从未调用shared_ptr对象的析构函数
- 是否可以在其析构函数中使用指向已销毁对象的指针?
- 使用私有析构函数删除动态分配的对象
- C++ std::线程调用方法,从对象原因到调用此类的析构函数
- 为什么在这里调用析构函数,以及在调用该对象析构函数后如何调用对象成员函数?
- 对象析构函数在多线程处理时不断被调用,但该对象并未超出范围
- C++包含包含指针的对象的对象析构函数
- Objective-C++C++对象析构函数
- 结构对象析构函数
- 在Exit()时调用基本对象析构函数