gpt4 book ai didi

c++ - 父类使用默认构造函数;子类的析构函数被意外调用

转载 作者:太空宇宙 更新时间:2023-11-04 16:01:29 29 4
gpt4 key购买 nike

我在 C++ 中有一个场景,在我没有预料到的情况下调用子进程的析构函数。最小的复制如下:

#include <cstdio>
#include <memory>

using namespace std;

class Parent {
public:
};

class Child : public Parent {
public:
~Child() {
printf("Got here\n");
}
};

int
main()
{
shared_ptr<Parent> x(new Child);
}

通常这样的事情是一个错误。开发人员打算调用子析构函数,正确的操作是将一个空的虚拟析构函数插入父析构函数。然而,令我震惊的是,G++ 4.4.7(是的,我知道它很旧)和 clang 3.4.2 都会编译它,以便调用子析构函数

这符合标准吗?

最佳答案

好吧,即使 shared_ptr 没有特殊的魔法,delete父指针和非虚析构函数只是未定义的行为,所以结果(调用子析构函数)肯定会符合要求。

但在这种情况下,shared_ptr“记住”您传递给它的原始对象的类型,并通过子指针(通过其存储的删除器)销毁它。

关于c++ - 父类使用默认构造函数;子类的析构函数被意外调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43078967/

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