2016-10-23 5 views
-1

何があっても、xとほぼ同じように実装されていますが、xにアクセスできるようです。メモリアクセスの問題があるかどうかはわかりません。プログラムはコンパイルエラーや警告なしでxの最初のアクセスでブレークします。 xが存在しない場合、CPUの呼び出しステップは正常に動作します。どんな助けも素晴らしいです。特定の構造体メンバにアクセスするとプログラムがクラッシュする

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; 

} 

答えて

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::CPUおよびSystemI::Interconnectは未初期化のままです。

+0

どうすれば初期化できますか?アイブは私が被験者に見つけたすべてのものを試しましたが、私は何かが欠けているに違いありません –

+1

ローカル変数の定義を削除することができます: 'CPU = new CPUI();相互接続=新しいInterconnectI(p、r); '。スマートポインタの使用を検討する方が良いですが – AVK

関連する問題