返回的值与实际返回的值不相同
Value of return is not same as value actually returned?
本文关键字:返回 更新时间:2023-10-16
我有一个小bug,让我心烦意乱。也许这很简单,但我完全迷路了。
我有一个基本的POD struct
:
struct Data{
bool isInvalid=false;
vec3 *vector; //vec3 is another struct with x,y,z components
Node*node;
bool isFresh;
unsigned int *form;
};
我有一个函数:
Data getData(){
Data forReturn;
//...populates the forReturn struct
cout<<forReturn.vector->x; //logs correctly a value
return forReturn;
}
cout
日志正确地显示我的返回Data
已被填充。但是当我从另一个函数中调用这个函数时,出现了一个不同的故事:
Data newData=getData(); //logs as above
cout<<newData.vector->x; //is empty!!
这是怎么回事?我的日志输出显示这两行并排出现,因为它们紧接在一起,但是发生了什么?这不是多线程的,所以变量和指针不应该在这两行之间改变!
如果这样写,则在返回过程中复制本地数据(forReturn)。因此,以正确的方式实现data类的复制构造函数(以正确的方式复制所有成员)
除非我看到您的实际代码,否则我无法确定,但我打赌您的程序具有未定义行为,因为您正在解引用悬空指针。我相信在您的getData()
函数中,您让forReturn.vector
指向具有自动存储持续时间的本地对象,该对象在从getData()
返回时被销毁,如下所示:
Data getData(){
Data forReturn;
vec3 myVector;
// ...
forReturn.vector = &myVector;
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
// ...
cout<<forReturn.vector->x; // logs correctly a value
return forReturn;
}
在上面的例子中,我按值返回Data
对象forReturn
,这意味着将调用隐式声明的移动构造函数(在c++ 11中)或复制构造函数(在c++ 03中)。
由于这些隐式生成的特殊成员函数执行按成员移动或复制数据结构的成员,因此复制了vector
指针,这意味着我返回的是Data
类型的对象,其vector
指针指向已经超出作用域的对象。
这是一个定时炸弹。一旦该指针被解引用,"Boom"。注意,"Boom"实际上可以是一个非常无声的爆炸——未定义行为意味着任何都可能发生,包括什么都不发生。
相关文章:
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- 什么时候在C++中返回常量引用是个好主意
- 你能重载对象变量名本身返回的内容吗
- 为什么 Serial.println(<char[]>);返回随机字符?
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- 如何获取std::result_of函数的返回类型
- QueryWorkingSet总是返回false
- (C++)分析树以计算返回错误值的简单算术表达式
- 访问者访问变体并返回不同类型时出错
- 如何返回一个类的两个对象相加的结果
- OpenInventor从9.8升级到10.4.2后,GLSL纹理返回零
- lower_bound()返回最后一个元素
- "throw expression code" 1e7 >返回 d 是什么?投掷标准::overflow_error( "too big" ) : d;意味 着?
- 奇怪的(对我来说)返回声明 - 在谷歌上找不到任何关于它的信息
- 如何取消对nullptr的屏蔽,返回正确的对象
- 奇怪的结构&GCC&clang(void*返回类型)
- 架构决策:返回std::future还是提供回调
- 从python中调用C++函数并获取返回值
- 矩阵向量乘法(cublasDgemv)返回零
- 为什么模板类中的对象不能返回值