指针转换导致 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 << "test\n";
}
};
Base* getBase (Derived* d) {
return (Base*) d;
}
int main()
{
Derived* d;
Base* b = getBase(d);
b->print();
return 0;
}
此代码编译(使用 g++)没有任何问题,但在 运行 之后,它崩溃了!
我尝试了不同类型的转换(例如 static_cast<>)但没有任何效果。
有什么问题?
您没有分配对象的实例,例如
Derived* d = new Derived();
因此变量 d
包含无法取消引用的垃圾数据。
Derived* d;
那是一个指针,但您没有将它初始化为指向 Derived
对象,因此它的值无效。使用它会产生未定义的行为;最有可能的是,由于访问无效地址而导致崩溃。
尝试创建一个对象,然后使用指向该对象的指针:
Derived d;
Base * b = getBase(&d);
请注意,邪恶的转换(或者甚至是不那么邪恶的 C++ 风格的转换)不需要转换为基数-class 指针;你可以做
Base * b = &d;
#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<>)但没有任何效果。
有什么问题?
您没有分配对象的实例,例如
Derived* d = new Derived();
因此变量 d
包含无法取消引用的垃圾数据。
Derived* d;
那是一个指针,但您没有将它初始化为指向 Derived
对象,因此它的值无效。使用它会产生未定义的行为;最有可能的是,由于访问无效地址而导致崩溃。
尝试创建一个对象,然后使用指向该对象的指针:
Derived d;
Base * b = getBase(&d);
请注意,邪恶的转换(或者甚至是不那么邪恶的 C++ 风格的转换)不需要转换为基数-class 指针;你可以做
Base * b = &d;