繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM