【问题标题】:Program crashing when accessing a specific struct member访问特定结构成员时程序崩溃
【发布时间】:2016-10-23 04:15:56
【问题描述】:

无论我做什么,我似乎都可以访问 x,即使它的实现几乎与 y 相同。我不确定它是否是某种内存访问问题。程序在第一次访问 x 时中断,没有编译错误或警告。 如果 x 不存在,则在 CPU 中调用 step 可以正常工作。任何帮助都很棒。

ESys.h

#pragma once

namespace ESYS
{
    struct InterconnectI
    {
        int y;
        std::vector<uint8_t>& Ip;
        std::vector<uint8_t>& Ir;

        InterconnectI(std::vector<uint8_t>& p, std::vector<uint8_t>& r);
        ~InterconnectI(){};
        void hi(int n);

    };

    struct CPUI
    {
        int x;

        CPUI();
        ~CPUI(){};
        void step(InterconnectI* i);

    };

    struct SystemI
    {
        CPUI* CPU;
        InterconnectI* Interconnect;

        SystemI(std::vector<uint8_t>& p, std::vector<uint8_t>& r);
        void Step();
    };
}

ESys.cpp

#include "stdafx.h"
#include "ESys.h"

namespace ESYS
{

    InterconnectI::InterconnectI(std::vector<uint8_t>& p, std::vector<uint8_t>& r) : Ip(p), Ir(r)
    {
        y = 0;
    }

    void InterconnectI::hi(int n)
    {
        std::cout << "Interconnect " << n << std::endl;
    }

    CPUI::CPUI()
    {
        x = 5;
    }

    void CPUI::step(InterconnectI* i)
    {
        std::cout << "Step CPU -> " x;  //Accessing doesn't work...
        i->hi(x);                       //Passing doesn't work...
    }

    SystemI::SystemI(std::vector<uint8_t>& p, std::vector<uint8_t>& r)
    {
        CPUI* CPU = new CPUI();
        InterconnectI* Interconnect = new InterconnectI(p, r);
    }

    void SystemI::Step()
    {
        CPU->step(Interconnect);
    }
}

Main.cpp

#include "stdafx.h"
#include "ESys.h"

std::vector<uint8_t> pDat;
std::vector<uint8_t> rDat;

int main(int argc, const char *argv[])
{

    ESYS::SystemI ESystem(pDat, rDat);
    ESystem.Interconnect->y = 11;

    for (;;)
    {
        ESystem.Step();
    }
    return 0;

}

【问题讨论】:

    标签: c++ struct crash member


    【解决方案1】:

    问题出在这里:

    SystemI::SystemI(std::vector<uint8_t>& p, std::vector<uint8_t>& r)
    {
        CPUI* CPU = new CPUI();
        InterconnectI* Interconnect = new InterconnectI(p, r);
    }
    

    new 的结果赋值给局部变量CPUInterconnect。数据成员 SystemI::CPUSystemI::Interconnect 保持未初始化。

    【讨论】:

    • 如何初始化它们?我已经尝试了我在该主题上找到的所有内容,但我一定遗漏了一些东西。
    • 您可以删除局部变量定义:CPU = new CPUI(); Interconnect = new InterconnectI(p, r);。虽然,最好考虑使用智能指针
    猜你喜欢
    • 2020-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多