C++ 在C+中,获取指向派生类的指针会导致运行时异常+;

C++ 在C+中,获取指向派生类的指针会导致运行时异常+;,c++,pointers,inheritance,abstract-class,C++,Pointers,Inheritance,Abstract Class,我有一个简单的抽象基类: class Sensor { protected: GenericDriver *driver; public: Sensor() {}; virtual void startNewReadout(void) = 0; }; 我从中派生出一个具体类: class OneWireSensor : public Sensor { private: OneWireDriver oneWireDriver; //not really neces

我有一个简单的抽象基类:

class Sensor {
protected:
    GenericDriver *driver;
public:
    Sensor() {};
    virtual void startNewReadout(void) = 0;
};
我从中派生出一个具体类:

class OneWireSensor : public Sensor {
private:
    OneWireDriver oneWireDriver; //not really necessary here
public:
    OneWireSensor(PinData *pinData);
    void startNewReadout(void){
        this->driver->driverStartReadout();
    }
};
现在,当我使用下面的构造函数时,我的代码按照预期编译和运行:

OneWireSensor::OneWireSensor(PinData *pinData) : oneWireDriver(OneWireDriver(pinData)) {
    this->driver = &oneWireDriver;
}
但是,我的代码中没有使用field oneWireDriver,我不想设置它。但当我从OneWireSensor类中删除它并使用构造函数时,如下所示:

OneWireSensor::OneWireSensor(PinData *pinData) {
    OneWireDriver oneWireDriver(pinData);
    this->driver = &oneWireDriver;
}
代码编译得很好,但执行结束时出现运行时异常(由于我在嵌入式系统上,这是一个系统硬故障)。GenericDriver是OneWireDriver类继承的抽象类。
在第二种情况下我做错了什么?

在问题情况下
oneWireDriver
仅在构造函数运行时存在,然后它就超出了范围。使用任何指向它的指针都是未定义的行为。

在问题案例中,
oneWireDriver
仅在构造函数运行时存在,然后它就超出了范围。使用指向它的任何指针都是未定义的行为。

该问题很可能是由来自
OneWireSensor的构造函数的悬空指针造成的

OneWireSensor::OneWireSensor(PinData *pinData) {

    // A function local object.
    OneWireDriver oneWireDriver(pinData);

    // Pointer to the function local object.
    // It becomes a dangline pointer as soon as the function returns.
    this->driver = &oneWireDriver;
}
您需要使用动态分配的对象

OneWireSensor::OneWireSensor(PinData *pinData) {

    this->driver = new OneWireDriver(pinData);
}

但是,您必须编写代码来管理动态分配的内存。最好使用智能指针而不是原始指针。有关智能指针的详细信息,请参阅。

此问题最有可能是由来自
OneWireSensor的构造函数的悬空指针造成的

OneWireSensor::OneWireSensor(PinData *pinData) {

    // A function local object.
    OneWireDriver oneWireDriver(pinData);

    // Pointer to the function local object.
    // It becomes a dangline pointer as soon as the function returns.
    this->driver = &oneWireDriver;
}
您需要使用动态分配的对象

OneWireSensor::OneWireSensor(PinData *pinData) {

    this->driver = new OneWireDriver(pinData);
}

但是,您必须编写代码来管理动态分配的内存。最好使用智能指针而不是原始指针。有关智能指针的详细信息,请参阅。

您正在此处创建对象:

OneWireSensor::OneWireSensor(PinData *pinData) {
    OneWireDriver oneWireDriver(pinData); //<<<------
    this->driver = &oneWireDriver;
}
OneWireSensor::OneWireSensor(PinData*PinData){

OneWireDriver OneWireDriver(pinData);//您正在此处创建对象:

OneWireSensor::OneWireSensor(PinData *pinData) {
    OneWireDriver oneWireDriver(pinData); //<<<------
    this->driver = &oneWireDriver;
}
OneWireSensor::OneWireSensor(PinData*PinData){

OneWireDriver OneWireDriver(pinData);//使用了
OneWireDriver
成员,但在其别名下使用了
*this->driver
。当您初始化
this->driver
指向
OneWireDriver
时,随后使用
this->driver
会“使用”
oneWireDriver
。在第二个代码示例中,
oneWireDriver
是构造函数的本地对象,因此在构造函数完成时不再存在。
this->driver
因此是一个悬空引用(指向不再存在的对象)因此,使用它会导致未定义的行为。
oneWireDriver
成员被使用,但在其别名
*this->driver
下。当您初始化
this->driver
指向
oneWireDriver
时,
this->driver
的后续用法不会“使用”
oneWireDriver
。在第二个代码示例中,
oneWireDriver
是构造函数的本地对象,因此在构造函数完成时不再存在。
this->driver
因此是一个悬空引用(指向不再存在的对象)因此,使用它会导致未定义的行为。非常感谢您指出这一点。关于哪种智能指针可能最适合我的应用程序,有什么建议吗?我希望对象永远存在于程序中,并确保它指向正确的方向place@Slighten,即使存在一个类型为
OneWireDriver
的对象,也有其他考虑因素ns.如果您不希望复制指针,也就是说,没有复制包含指针的对象,您可以使用
std::unique_ptr
。如果您执行要复制的指针,请使用
std::shared_ptr
。非常感谢您指出这一点。关于哪个智能指针最适合我的应用程序,有什么建议吗?我想要这个对象永远生活在节目中,并确保它指向正确的方向place@Slighten,即使存在一个类型为
OneWireDriver
的对象,也有其他注意事项。如果您不希望复制指针,也可以使用
std::unique\u ptr
,即保存指针的对象未被复制。如果您执行要复制的inter,请使用
std::shared\u ptr