【发布时间】:2020-02-17 21:52:48
【问题描述】:
我遇到了一些奇怪的行为,我不确定该转向哪里。
基本上,我有一组类,其中一个应该由另外两个的实例构成。我正在使用传递引用来分配资源,但第二个分配在我的机器上崩溃了。我不明白为什么第二个任务会崩溃,但第一个工作正常。为了让这更令人困惑,我尝试在在线 cpp 编译器中重新创建问题,但它似乎在那个环境中运行良好。
我隐藏了类名并删除了一些似乎与此问题无关的方法。有人有什么想法吗?
#include <iostream>
using namespace std;
class Driver{};
class ITransmission{};
class ManualTransmission : public ITransmission {};
class Car
{
public:
Car(ITransmission &trans, Driver &driver);
private:
ITransmission *m_trans;
Driver *m_driver;
};
Car::Car(ITransmission &trans, Driver &driver)
{
*m_trans = trans;
*m_driver = driver; // <-- **** Crashes here!?!? ****
}
int main()
{
ITransmission *trans = new ManualTransmission();
Driver *driver = new Driver();
Car car(*trans, *driver);
return 0;
}
【问题讨论】:
-
*m_driver的意思是“转到存储在m_driver中的地址并获取那里的值。”现在问问自己:当您尝试取消引用m_driver时,它指向哪里? -
m_trans 和 m_driver 不指向任何东西,你的代码有 UB。它与通过引用传递无关。
-
感谢您通过正确的演示示例提出明确的问题!我不会回答,因为人们已经在 cmets 中回答了。顺便说一句,here 提到您的玩具模型不需要指针;可能你的真实代码也不需要它们。
-
@Borgleader 这是有道理的,我认为它会起作用,因为它正在分配取消引用的值,但我想现在我想这并没有真正的意义。因此,如果我想用预初始化的 Driver 和 Transmission 对象构造 Car,我是否需要使用
Car(ITransmission *trans, Driver *driver);之类的东西,然后使用m_trans = trans分配成员? -
@eeScott
ITransmission和Driver对象在Car对象中的预期生命周期是多少?他们会不会被转移到另一个Car?或者它们是否存在于Car的整个生命周期中,并且只存在于这个Car中?
标签: c++