2017-10-10 119 views
-2

在方法v_init()Algo::Init()的調用過程中,線路m_Lights=tmp;上有內存訪問衝突錯誤。不應該在m_LightsManager的實例化處創建映射m_Lights?爲什麼我有這個錯誤?使用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

什麼是'Light',爲什麼要這樣'的std :: memset的(TL,0,的sizeof(光));'? –

+0

如果代碼正確縮進,代碼會更容易閱讀...... – Borgleader

+3

OT'v_init'的原因是什麼?使用構造函數! – 2017-10-10 11:37:21

回答

2

如果Light不是trivially-copyable然後

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

不確定的行爲。這可能是你錯誤的原因。

+6

...即使它可以輕易複製該行是非常可疑的,可能不應該在那裏 – user463035818

+0

我補充說,因爲我已經認爲它可能來自對象的錯誤tL, – Bil

+1

@Bil:我們在沒有[MCVE]的情況下無法真正幫助你,我們所能做的只是猜測。 –

1

除了Vittorios答案:在Light的構造函數中做所有的初始化,而不是依靠外部的memset調用。並且不要在C++中使用std::memset在一個語句中初始化對象的所有成員變量,爲每個變量明確地執行它(通常使用簡單賦值;在C++ 11中,即使在聲明/頭文件中也可以這樣做,其中它恕我直言屬於)。

原因是:Light可能會派生,並且基類定義了它們自己的數據,通過不計後果地將整個對象歸零。

0

我解決了這個錯誤,問題就來了,從一個錯誤的宣佈,與該對象m_LightsManager哪裏開始的內存空間overlaped軟的另一部分指針,

+0

看,這就是爲什麼你應該給[mcve],而不是僅僅丟棄你假設的一塊代碼**問題必須隱藏起來。 – Murphy

相關問題