Std::cout改变变量的值
std::cout changing the variable value
我正在编码我的函数是正确返回一个指针到引用。我发现,虽然这个函数返回了它应该做的事情,但是,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 *¤tIndex, 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 *¤tIndex, MyClass obj)
{
currentIndex = &obj.m_Index;
}
调用未定义的行为,因为obj
仅在函数调用的生命周期内有效。你保留一个指向它(或它的一个成员)的指针,在它超出作用域后使用。
你可以通过指向不超出范围的东西来解决这两个问题(参见@ songyuananyao的答案)。在这种情况下,不清楚为什么需要指针。myfunction
只能返回索引
obj
参数是按值传递的,因此创建了一个副本,该副本将在函数退出时销毁。currentIndex
被设置为指向一个无效地址,解引用它是未定义的行为。它可能工作得很好,也可能不工作,一切皆有可能。
一个解决方案是使obj
通过引用而不是通过值传递:
void myfunction(int *¤tIndex, MyClass& obj)
{
currentIndex = &obj.m_Index;
}
相关文章:
- 变量没有改变?通过向量的函数调用
- 在向量内更改变量的值不会改变其在向量外的值
- C++11:具有互斥锁的线程看到原子变量的值发生变化,尽管这是唯一可以改变它的代码
- 为什么我可以改变常量对象中的成员变量,这是返回常量对象函数的结果?
- 标准在哪里定义了可变变量可以改变
- C++11:可变的 lambda 似乎没有改变变量?
- printf() 似乎改变了一个变量
- 为什么我的变量在单独的线程中修改时没有改变?C++/boost
- 为什么 Player.x 和 Player.y 变量没有改变?
- C - 如何将各处的静态函数称为改变其私有变量
- 即使"friend class rect"在平方类中被评论,为什么它要改变矩形类的私有变量?
- 为什么调用 CUDA 内核函数时这个类成员变量没有改变
- 全局变量的顺序会改变C /OpenGL的性能
- 为什么一个函数的末尾有常量这个词,即使它确实改变了一个变量
- 如何在C++中改变超类和子类的变量
- 为什么变量不会改变
- 变量的范围大于for循环,为什么它不改变值
- 变量似乎在自行改变值
- 在一个case中改变switch变量
- 当赋值给变量时,数字改变值