指针的转换导致C++中的崩溃

指针的转换导致C++中的崩溃,c++,pointers,casting,crash,virtual,C++,Pointers,Casting,Crash,Virtual,这段代码用g++编译没有任何问题,但在运行之后,它崩溃了! 我尝试了不同类型的铸造像静态_铸造,但没有工作 问题是什么?您没有分配对象的实例,例如 #include <iostream> class Base { public: virtual void print() = 0; }; class Derived : public Base { public: void print() { std::cout << "test\n";

这段代码用g++编译没有任何问题,但在运行之后,它崩溃了! 我尝试了不同类型的铸造像静态_铸造,但没有工作


问题是什么?

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

#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;
}

因此,变量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;
}
Derived* d = new Derived();
因此,变量d包含无法取消引用的垃圾数据

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

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

Derived* d;

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

Derived d;
Base * b = getBase(&d);
这是一个指针,但您没有初始化它以指向派生对象,因此它的值无效。使用它会产生未定义的行为;很可能是由于访问无效地址而导致崩溃

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

Derived* d;

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

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

虽然这里没有问题,但不要在C++对象中使用C样式的转换,因为有些情况下它们不工作,只会给出错误的结果。使用STATICECAST代替。虽然这里没有问题,但C++的对象不使用C样式的转换——有一些角落的情况,它们不工作,只会给出错误的结果。改用静态_cast。