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
文件。
所以我在想,我无法访问在不同线程中创建的指针,这听起来有点尴尬。
问题出在哪里?
答案 0 :(得分:3)
您发布的代码格式不正确,即它是错误的,正式无法编译。表达式SomeStruct()
生成一个临时对象。将内置的一元&
运算符应用于C ++中的临时对象是违法的。
如果您的编译器以某种方式允许将&
应用于临时,则很可能会立即销毁该临时值,这意味着您的指针无处指向(悬空指针)。难怪当你试图取消引用无效指针时代码会崩溃。
线程与它无关。
答案 1 :(得分:2)
这是 未定义行为的配方(UB)一些非法代码,不应该在符合标准的实现上编译。你不能拿一个临时的地址:
SomeStruct *structure = &SomeStruct();
GCC产生以下输出:
错误:获取临时[-fpermissive]
的地址
如果你的编译器接受了这个,它可能会给你一个悬空指针。取消引用这将是未定义的行为。
请注意,这些都与多线程无关。
答案 2 :(得分:1)
你应该感谢VS创作者提供的C ++“功能”,他们已经添加到语言中了。其中之一 - 临时转换为左值。在合法的C ++中,您将无法获取临时和后续行的地址:
SomeStruct *structure = &SomeStruct();
不会编译,也不应该编译。您正在获取临时变量的地址,该变量在此行之后被销毁。