2016-06-20 41 views
0

我有函數。 FunctionA和FunctionB。兩個函數局部變量的內存衝突

in FunctionA 
{ 
    char *m; //Pointed to Shared Memory A 
    char outa[600000] 
    //Coping the Data into another character array 
    memcpy(out, m, 6000000); 
    // Now Processing this Data, 
    // After Processing I am storing this data. 
} 

in FunctionB 
{ 
    char *m; //Pointed to Shared Memory B 
    char outb[600000] 
    //Coping the Data into another character array 
    memcpy(out, m, 6000000); 
    // Now Processing this Data, 
    // After Processing I am storing this data. 
} 

現在主要是,我創建一個線程函數,不斷調用函數A和函數B,一個接一個。

但是,有時函數outBuffer得到,而讀取函數B出緩衝區。

但是,當我移動這兩個緩衝區作爲一個類的成員變量,然後沒有內存衝突的問題。

爲什麼發生在第一種情況? 我做了什麼錯事?

+3

請提供一個[mcve] –

+0

*「當我將這兩個緩衝區作爲類的成員變量移動時」* - 哦,親愛的... * * facepalm \ *您的函數有本地數組,它們在您退出時被銷燬。沒有記憶碰撞發生!你只有UB的股息(指向無效的緩衝區) – WhiZTiM

回答

0

正如@RevolverOcelot指出的那樣,請提供MWE。 另外,這兩個'm'指針都未初始化。 保留正確大小的內存,然後使用memcpy。

例如:

char *m = new char[600000]; 

...

memcpy(out, m, 6000000); 
在兩種功能

。 請記住釋放分配的內存。

1

您聲明瞭一個600.000字節的數組(char = 1字節),然後複製了6.000.000字節。我認爲這造成了混亂。

我會強烈建議寫在科學記數法這樣的數字像

char test[long(6e6)]; 
memcpy(.. , .., long(6e6)); 

char test[long(6e6)]; 
memcpy(.. , .., sizeof(test)); 

,以避免今後發生此類錯誤。