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
。