无法从另一个线程访问指针?

时间:2014-01-13 16:37:23

标签: c++ multithreading pointers

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]->someValue中调用getSomeValue()从另一个线程调用时,VS说:“访问冲突”并打开memcpy.asm文件。

所以我在想,我无法访问在不同线程中创建的指针,这听起来有点尴尬。

问题出在哪里?

3 个答案:

答案 0 :(得分:3)

您发布的代码格式不正确,即它是错误的,正式无法编译。表达式SomeStruct()生成一个临时对象。将内置的一元&运算符应用于C ++中的临时对象是违法的。

如果您的编译器以某种方式允许将&应用于临时,则很可能会立即销毁该临时值,这意味着您的指针无处指向(悬空指针)。难怪当你试图取消引用无效指针时代码会崩溃。

线程与它无关。

答案 1 :(得分:2)

这是 未定义行为的配方(UB)一些非法代码,不应该在符合标准的实现上编译。你不能拿一个临时的地址:

SomeStruct *structure = &SomeStruct();

GCC产生以下输出:

  

错误:获取临时[-fpermissive]

的地址

如果你的编译器接受了这个,它可能会给你一个悬空指针。取消引用这将是未定义的行为。

请注意,这些都与多线程无关。

答案 2 :(得分:1)

你应该感谢VS创作者提供的C ++“功能”,他们已经添加到语言中了。其中之一 - 临时转换为左值。在合法的C ++中,您将无法获取临时和后续行的地址:

SomeStruct *structure = &SomeStruct();

不会编译,也不应该编译。您正在获取临时变量的地址,该变量在此行之后被销毁。