为什么引用传递会导致此崩溃(C++)

Why does pass by reference cause this to crash (C++)?

本文关键字:崩溃 C++ 引用 为什么      更新时间:2023-10-16

我遇到了一些奇怪的行为,我真的不知道该去哪里。

基本上,我有一组类,其中一个类应该用另外两个类的实例来构造。我正在使用pass-by-reference来分配资源,但第二次分配在我的机器上崩溃了。我不明白为什么第二个作业失败了,但第一个作业很好。为了让这更令人困惑,我尝试在一个在线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_trans*m_drivers只是指向它们各自类型的指针。它们本身不是对象。在您的副本构造函数中,您正在调用

*m_trans = trans

它崩溃是因为m_trans没有指向任何东西,而您正在取消引用它。你想要的是

m_trans = &trans
m_driver = &driver

这将指针设置为指向您传入的对象的地址,而在您尝试分配给指向的对象之前。