Std::cout改变变量的值

std::cout changing the variable value

本文关键字:变量 改变 cout Std      更新时间:2023-10-16

我正在编码我的函数是正确返回一个指针到引用。我发现,虽然这个函数返回了它应该做的事情,但是,std::cout正在修改结果。我做错什么了吗?如何纠正这种行为?

请参考以下代码片段

#include "stdafx.h"
#include <iostream>
using namespace std;
class MyClass
{
 public:
 MyClass(int x_):m_Index(x_){}
 int m_Index;
};
void myfunction(int *&currentIndex, MyClass obj)
{
 currentIndex = &obj.m_Index;
}
int _tmain(int argc, _TCHAR* argv[])
{
  MyClass obj(5);
  int *Index = NULL;
  myfunction(Index, obj);
  int curr_Index = *Index;
  cout << "Index = " << curr_Index << std::endl; // This works fine.
  cout << "Index = " << *Index << std::endl;     // This modifies *Index
  return 0;
}
void myfunction(int *&currentIndex, MyClass obj)
{
 currentIndex = &obj.m_Index;
}

调用未定义的行为,因为obj仅在函数调用的生命周期内有效。你保留一个指向它(或它的一个成员)的指针,在它超出作用域后使用。

你可以通过指向不超出范围的东西来解决这两个问题(参见@ songyuananyao的答案)。在这种情况下,不清楚为什么需要指针。myfunction只能返回索引

obj参数是按值传递的,因此创建了一个副本,该副本将在函数退出时销毁。currentIndex被设置为指向一个无效地址,解引用它是未定义的行为。它可能工作得很好,也可能不工作,一切皆有可能。

一个解决方案是使obj通过引用而不是通过值传递:

void myfunction(int *&currentIndex, MyClass& obj)
{
  currentIndex = &obj.m_Index;
}