【问题标题】:Pointer casting leads to crash in c++指针转换导致 C++ 崩溃
【发布时间】:2015-04-30 15:59:13
【问题描述】:
#include <iostream>

class Base {
public:
    virtual void print() = 0;
};

class Derived : public Base {
public:
    void print() {
        std::cout << "test\n";
    }
};

Base* getBase (Derived* d) {
    return (Base*) d;
}

int main()
{
    Derived* d;
    Base* b = getBase(d);
    b->print();

    return 0;
}

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

有什么问题?

【问题讨论】:

  • 虽然不是这里的问题,但不要对 C++ 对象使用 C 风格的强制转换 - 在某些极端情况下它们不起作用并且只会给出错误的结果。请改用 static_cast。

标签: c++ pointers casting crash virtual


【解决方案1】:
Derived* d;

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

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

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

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

Base * b = &d;

【讨论】:

    【解决方案2】:

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

    Derived* d = new Derived();
    

    所以变量d 包含无法取消引用的垃圾数据。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-27
      • 2016-08-27
      • 2019-04-01
      • 1970-01-01
      相关资源
      最近更新 更多