Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 无法从另一个线程访问指针? struct SomeStruct{ int值; }; 向量向量机; int getSomeValue(){//从另一个线程调用 返回vec[0]->someValue; } int main(){ SomeStruct*structure=&SomeStruct(); 结构->某些值=42; 向量推回(结构); }_C++_Multithreading_Pointers - Fatal编程技术网

C++ 无法从另一个线程访问指针? struct SomeStruct{ int值; }; 向量向量机; int getSomeValue(){//从另一个线程调用 返回vec[0]->someValue; } int main(){ SomeStruct*structure=&SomeStruct(); 结构->某些值=42; 向量推回(结构); }

C++ 无法从另一个线程访问指针? struct SomeStruct{ int值; }; 向量向量机; int getSomeValue(){//从另一个线程调用 返回vec[0]->someValue; } int main(){ SomeStruct*structure=&SomeStruct(); 结构->某些值=42; 向量推回(结构); },c++,multithreading,pointers,C++,Multithreading,Pointers,我有这样的密码。问题是,当我在从另一个线程调用的getSomeValue()中调用return vec[0]->someValue时,VS说:“访问冲突”,并打开memcpy.asm文件 所以我在想,我无法访问在不同线程中创建的指针,这听起来有点尴尬 问题在哪里 这是未定义行为(undefined Behavior,UB)的一个配方,一些非法代码不应该在符合标准的实现上编译。您不能获取临时用户的地址: struct SomeStruct{ int someValue; }; vecto

我有这样的密码。问题是,当我在从另一个线程调用的
getSomeValue()
中调用
return vec[0]->someValue
时,VS说:“访问冲突”,并打开
memcpy.asm
文件

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

问题在哪里

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

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);
}
GCC产生以下输出:

错误:获取临时[-fppermissive]的地址

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


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

您发布的代码格式不正确,即它是错误的,在形式上是不可编译的。表达式
SomeStruct()
生成一个临时对象。对C++中的临时对象应用内置的一元<代码>和<代码>操作符是非法的。 如果编译器允许将
&
应用于临时对象,则很可能会立即销毁该临时对象,这意味着您的指针没有指向任何地方(悬空指针)。难怪在尝试取消引用无效指针时代码会崩溃


<>线程与此无关。

你应该感谢VS创建者的C++“特性”,他们加入了语言。其中之一是将临时值隐式转换为左值。在合法的C++中,您将无法获取临时和后续行的地址:

SomeStruct *structure = &SomeStruct();

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

SomeStruct*structure声明一个未初始化的指针。按当前状态,它不是有效代码。您是否缺少
SomeStruct()
之前的
new
。我们没有必要猜测它。你的指针在其他线程中是有效的-你的问题在别处。可能第一个线程处理了对象(它在堆栈上),或者在线程仍在使用它时将其删除。很难用你的伪代码来判断@安德烈:你完全正确。我编辑了这个(和+1给你)。
SomeStruct *structure = &SomeStruct();