指针强制转换会导致 C++ 崩溃

Pointer casting leads to crash in c++

本文关键字:C++ 崩溃 转换 指针      更新时间:2023-10-16
#include <iostream>
class Base {
public:
    virtual void print() = 0;
};
class Derived : public Base {
public:
    void print() {
        std::cout << "testn";
    }
};
Base* getBase (Derived* d) {
    return (Base*) d;
}
int main()
{
    Derived* d;
    Base* b = getBase(d);
    b->print();
    return 0;
}

这段代码编译(使用 g++)没有任何问题,但运行后,它崩溃了!我尝试了不同类型的选角(如static_cast<>),但没有任何效果。

问题出在哪里?

Derived* d;

这是一个指针,但您不会将其初始化为指向Derived对象,因此它具有无效值。使用它会产生未定义的行为;最有可能的是,由于访问无效地址而导致崩溃。

尝试创建一个对象,然后使用指向该对象的指针:

Derived d;
Base * b = getBase(&d);

请注意,邪恶的强制转换(甚至是不那么邪恶的C++样式转换)不需要转换为基类指针;你可以这样做

Base * b = &d;

你没有分配对象的实例,例如

Derived* d = new Derived();

因此,变量 d 包含无法取消引用的垃圾数据。