c++ - 为什么按引用传递会导致崩溃(C++)?

标签 c++

我遇到了一些奇怪的行为,我不确定该向哪里求助。

基本上,我有一组类,其中一个应该用另外两个类的实例来构造。我使用引用传递来分配资源,但第二次分配在我的计算机上崩溃了。我不明白为什么第二个作业崩溃但第一个作业正常。为了让这更令人困惑,我尝试在在线 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

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

关于c++ - 为什么按引用传递会导致崩溃(C++)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60270885/

相关文章:

C++ 当我成功计算出另一个字符串时,我无法计算出一个字符串

c++ - `boost::any` 和 `std::any` 之间的差异

c++ - 为一个项目使用超过 1 个代码文件有什么好处? (C++)

c++ - boost 异步服务器缓冲区错误

c++ - 如何传递二维结构数组给函数?

c++ - C++ 链接器对于仅从程序中的一个类使用的虚拟方法是否聪明?

c++ - 如何正确使用 cv::Mat 和 Eigen::Matrix? (OpenCV + Eigen )

c++ - 来自调试代码的未使用变量警告

c++ - 向给定 remote_endpoint 对象和套接字的客户端发送数据包?

C++ 指向字符串类型段错误的指针