gpt4 book ai didi

c++ - 调用析构函数将已删除的指针分配给新对象

转载 作者:行者123 更新时间:2023-11-30 01:26:08 25 4
gpt4 key购买 nike

    #include <iostream>
#include <cstdlib>
#include <string.h>

using namespace std;

class A {
public:
A () {cout<<" A\n";}
virtual ~A () {cout<<" ~A\n";}
};

class B : public A {
public:
B () :A() {cout<<" B\n";}
virtual ~B() {cout<<" ~B\n";}
};

int main (int, char *[]) {
A *ap = new B;
delete ap;
A b = *ap;
return 0;
}

输出是:

  A

B

~B

~A

为什么要为 A b = *ap 调用 A 的最后一个析构函数为什么不在此处调用 A 的构造函数?

谢谢!!!

最佳答案

您遇到了未定义的行为任何事情都可能发生。

在你调用delete ap;之后取消引用它是非法的:

delete ap;
A b = *ap;

除此之外,您确实知道析构函数是按照相反的继承顺序调用的,对吧?这意味着如果删除 B,基类析构函数 ~A 也会被调用。

另请注意,如果它有效(实际上无效),A b = *ap; 将调用编译器生成的 copy-constructor,而不是您的构造函数。

关于c++ - 调用析构函数将已删除的指针分配给新对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10993774/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com