2014-01-13 108 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(); 

不会编译,它不应该编译。您正在使用临时变量的地址,该变量在此行之后立即被销毁。