2017-10-10 15 views
-2

のメソッドv_init()の呼び出し中に、m_Lights=tmp;行のメモリアクセス違反エラーが発生しました。 m_Lightsm_LightsManagerのインスタンスで作成する必要はありませんか?このエラーが発生するのはなぜですか?ローカルメンバーとしてstd :: mapを使用したメモリアクセス違反

class LightManager 
{ 
private: 
    std::map<sint32,Light> m_Lights; 
    public: 
    LightManager (void); 
    ~LightManager (void); 
    void v_init(); 
}; 

LightManager ::LightManager (void) 
{ 

} 



LightManager ::~LightManager (void) 
{ 
} 

void LightManager ::v_init() 
{ 
    Light tL; 
    std::memset(&tL,0,sizeof(Light)); 
    std::map<sint32,Light> tmp; 
    tmp.insert(std::pair<sint32,Light> (-1,tL)); 
    m_Lights=tmp; 
} 

class Algo 
{ 
private:  
    LightsManager m_LightsManager; 
.... 
public: 
Algo(); 
void Init(); 
}; 

    Algo::Algo() 
    { 
    Init(); 
    } 


void Algo::Init() 
{ 

    m_LightsManager.v_init(); 

} 
+7

、オブジェクトm_LightsManagerが開始されたメモリ空間を重ねたそのソフトの他の部分にポインタを宣言しました'std :: memset(&tL、0、sizeof(Light));'? –

+0

コードが正しくインデントされていれば、コードを読みやすくなります... – Borgleader

+3

OT 'v_init'の理由は何ですか?コンストラクタを使用してください! –

答えて

2

Lighttrivially-copyableない場合、

std::memset(&tL,0,sizeof(Light)); 

未定義の動作です。これはおそらくエラーの原因です。

+6

...たとえそれが単純にコピー可能であったとしても、その行は非常に疑わしいものであり、おそらく最初の場所にあるべきではないはずです。 – user463035818

+0

私はすでにオブジェクトのtLから来る可能性があると思ってエラーが発生したため追加しました: – Bil

+1

@Bil: [MCVE]がなければあなたを本当に助けてくれるはずがありません。 –

1

Vittoriosに加えて、答え:外部memsetコールに頼るのではなく、Lightのコンストラクタですべての初期化を行います。そして、C++でstd::memsetを使用して、あるステートメントのオブジェクトのすべてのメンバー変数を初期化しないでください。すべての変数に対して明示的に行います(通常、単純な代入を使用します。それはIMHOが属する)。

理由:Lightが導出され、基本クラスが独自のデータを定義し、オブジェクト全体を無謀に上書きして上書きします。

0

私は、エラーを解決し、問題が間違っているから来た `Light`、なぜあなたはこれをやっているとは何

+0

これは、問題を隠蔽しなければならないと仮定したコードを削除するのではなく、[mcve]を与えることになっている理由です。 – Murphy

関連する問題