[英]Can not access pointer from another thread?
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);
}
我有这样的代码。 问题是,当我在从另一个线程调用的getSomeValue()
调用return vec[0]->someValue
时,VS会说:“访问冲突”并打开memcpy.asm
文件。
所以我在想自己,我无法访问在其他线程中创建的指针,这对我来说有点尴尬。
问题出在哪儿?
您发布的代码格式不正确,即是错误的,形式上是不可编译的。 表达式SomeStruct()
产生一个临时对象。 在C ++中将内置的一元&
运算符应用于临时对象是非法的。
如果您的编译器以某种方式允许对临时对象应用&
,则很可能在此之后立即销毁该临时对象,这意味着您的指针没有指向任何地方(悬空的指针)。 难怪当您尝试取消引用无效指针时,代码会崩溃。
线程与此无关。
这是
未定义行为 (UB)的秘诀,
一些非法代码不应在符合标准的实现中进行编译。 您不能使用临时地址:
SomeStruct *structure = &SomeStruct();
GCC产生以下输出:
错误:使用临时地址[-fpermissive]
如果您的编译器接受了这一点,则可能会使您悬而未决。 取消引用将是不确定的行为。
请注意,这些都与多线程无关。
您应该感谢VS创建者将C ++“功能”添加到该语言中。 其中之一-临时转换为左值。 在合法的C ++中,您将无法获得临时地址和以下行的地址:
SomeStruct *structure = &SomeStruct();
将不会编译,也不应编译。 您正在获取一个临时变量的地址,该地址在此行后立即销毁。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.