Сбой программы при доступе к определенному элементу структуры

#c #struct #crash #member

#c #структура #сбой #Участник

Вопрос:

Что бы я ни делал, кажется, что я могу получить доступ к x, даже если он реализован почти так же, как y. Я не уверен, что это какая-то проблема с доступом к памяти. Программа завершает работу при первом обращении к x без ошибок компиляции или предупреждений. Этап вызова в процессоре работает нормально, если x там нет. Любая помощь будет замечательной.

ESys.h

 #pragma once

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

        InterconnectI(std::vector<uint8_t>amp; p, std::vector<uint8_t>amp; 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>amp; p, std::vector<uint8_t>amp; r);
        void Step();
    };
}
  

ESys.cpp

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

namespace ESYS
{

    InterconnectI::InterconnectI(std::vector<uint8_t>amp; p, std::vector<uint8_t>amp; 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>amp; p, std::vector<uint8_t>amp; 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;

}
  

Ответ №1:

Проблема здесь:

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

Результаты new присваиваются локальным переменным CPU и Interconnect . Элементы данных SystemI::CPU и SystemI::Interconnect остаются неинициализированными.

Комментарии:

1. Как я могу их инициализировать? Я перепробовал все, что нашел по этому вопросу, но, должно быть, я чего-то не хватает.

2. Вы можете просто удалить определения локальной переменной: CPU = new CPUI(); Interconnect = new InterconnectI(p, r); . Хотя, лучше рассмотреть возможность использования интеллектуальных указателей