gpt4 book ai didi

c++ - dynamic_cast 工作时程序应该失败/崩溃

转载 作者:搜寻专家 更新时间:2023-10-31 00:08:19 26 4
gpt4 key购买 nike

在我看来,下面的程序应该崩溃,但它不仅可以工作,而且显示正确的结果(“derv is called”)。

#include <iostream>
using namespace std;
class base
{
public:
virtual ~base(){}
};
class derv: public base
{
public:
void f() { cout << "derv is called" <<endl;}
};
int main() {
base* p = new base();
derv *d1 = dynamic_cast<derv*>(p);

// Since p point to base , so d1 should return nullptr
//calling any function using d1, should fail/crash
//but why the following line is working ??

d1->f();
}

抱歉,我忘记在我之前的帖子中添加几行:如果我添加一个数据成员并尝试访问它,会出现段错误,我认为这是正确的行为。我的问题是为什么访问数据成员会改变行为?当变量未被访问时,调用“f()”函数成功,而同一个函数“f()”在访问数据成员时出现段错误?是未定义的行为吗?

class derv: public base 
{
public:
int x = 0 ; // Added new member, c++11
void f() { cout << "derv is called " << x << endl;} //access it here
};

最佳答案

在您的程序中取消引用 d1 是一个 NULL 指针是未定义的行为:

base* p = new base();
derv *d1 = nullptr;
d1 = dynamic_cast<derv*>(p);

if(nullptr == d1) // condition succeeds which means d1 is nullptr
cout << "nullptr" << endl;

安全编程是程序员的任务,而不是编译器的任务,因此一个好的程序在使用前会进行检查:

// avoiding error prones and UBs
if(nullptr != d1)
d1->f();

关于c++ - dynamic_cast 工作时程序应该失败/崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49459826/

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