2014-01-13 82 views
-1
struct SomeStruct{ 
    int someValue; 
}; 

vector<SomeStruct *> vec; 

int getSomeValue(){    // Gets called from another thread 
    return vec[0]->someValue; 
} 

int main(){ 
    SomeStruct *structure = &SomeStruct(); 
    structure->someValue = 42; 

    vec.push_back(structure); 
} 

我有這樣的代碼。問題是,當我打電話return vec[0]->someValuegetSomeValue()從另一個線程調用,VS說:「訪問衝突」,並打開memcpy.asm文件。無法從另一個線程訪問指針?

所以我在想我自己,我不能訪問在不同線程中創建的指針,這對我來說聽起來有點尷尬。

問題在哪裏?

+0

'SomeStruct * structure;'聲明一個未初始化的指針。 –

+0

已編輯。對不起:) –

+1

目前,它不是有效的代碼。在SomeStruct()之前是否缺少'new'? –

回答

2

這裏這 未定義行爲(UB) 一些非法的代碼不應該在一個標準的編譯兼容的實現配方。你不能把一個臨時的地址:

SomeStruct *structure = &SomeStruct(); 

GCC產生以下輸出:

error: taking address of temporary [-fpermissive]

如果你的編譯器接受這一點,它會給你留下一個懸空指針。去引用那將是未定義的行爲。

請注意,這不涉及多線程。

+1

「未定義的行爲」?代碼格式不正確。 – AnT

+0

@AndreyT你是對的。我編輯了這個(和+1給你)。 – juanchopanza

3

您發佈的代碼格式不正確,即錯誤,形式上不可編譯。表達式SomeStruct()產生一個臨時對象。將嵌入的一元運算符&應用於C++中的臨時對象是非法的。

如果你的編譯器以某種方式允許將臨時應用&,它很可能會立即破壞臨時的,這意味着你的指針沒有指向任何地方(一個懸掛指針)。難怪當你試圖解引用一個無效的指針時,代碼會崩潰。

線程雖然與它無關。

1

您應該感謝VS創建者提供的C++「功能」,並將其添加到語言中。其中之一 - 臨時轉換爲左值。在合法的C++中,你將無法獲得臨時和以下行的地址:

SomeStruct *structure = &SomeStruct(); 

不會編譯,它不應該編譯。您正在使用臨時變量的地址,該變量在此行之後立即被銷燬。