指针强制转换会导致 C++ 崩溃
Pointer casting leads to crash in c++
#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
包含无法取消引用的垃圾数据。
相关文章:
- 当回溯以零开始时,如何调试崩溃
- 内联映射初始化的动态atexit析构函数崩溃
- 执行函数时导致崩溃的变量
- 程序崩溃并显示"std::out_of_range"错误
- CoInitialize()在单独的线程上崩溃而不返回
- 使用调试/崩溃报告将应用程序部署到客户端
- 为什么所有C++编译器都会崩溃或挂起此代码
- 为什么lambda在clang上崩溃而不是在gcc上崩溃
- 为什么我的多线程作业队列崩溃
- ExtractIconEx:可以工作,但偶尔会崩溃
- 为什么引用传递会导致此崩溃(C++)
- 试图创建流或fopen时程序崩溃
- 类对象数组的问题会导致崩溃
- 排序时无法执行交换操作.我做的时候它会崩溃.为什么
- 为什么要增加导致崩溃的指针
- 在虚幻引擎中删除NXOpen对象时崩溃
- 为什么它只打印双链接列表的第一个值,而我的程序却崩溃了
- 应用程序崩溃并显示"symbol _ZdlPvm, version Qt_5 not defined in file libQt5Core.so.5 with link time reference"
- Visual Studio在尝试读取resource.txt文件时崩溃
- 将方法转换为调用该方法的成员函子对象会导致崩溃