我是c ++的新手,但不是OOP。这次崩溃让我非常困惑。
这是我的主要内容。这段代码有效。它打印出我想要打印的内容。
int _tmain(int argc, _TCHAR* argv[]) {
Weapon* wp = createWeapon();
cout <<wp->name << " " << wp->maxAttack << " " << wp->minAttack; //<<---Works fine
}
但是。下面的代码,只通过一个函数传递它做同样的事情,崩溃了。我不明白为什么。我尝试过任何我能想到的东西,但是在进入新功能后,某些东西会改变数据而崩溃。
void showWeaponInfo(Weapon* w) {
cout << "Weapon: " << w->name << "\n"; //Wont work!??!
}
int _tmain(int argc, _TCHAR* argv[]) {
Weapon* wp = createWeapon();
showWeaponInfo(wp);
}
我已经调试了,这表明在进入新功能时,&#34; wp&#34;变化。以下链接是调试的图像。
我做错了吗?有人遇到过这个问题吗?将指针作为参数传递时,你是否必须考虑一些特殊的东西?
答案 0 :(得分:2)
在VC ++中,调试器将未分配变量的值设置为每字节204或在您的情况下 - 0xCCCCCCCC
这意味着你的createWeapon()会返回未初始化的指针。
答案 1 :(得分:1)
你没有告诉我们你的createWeapon()
。但我想createWeapon()
会返回局部变量的指针。你的功能是这样的吗?
Weapon* createWeapon()
{
Weapon wp(/*blabla*/);
// ...
return ℘
}
如果是这样,您就遇到了未定义的行为。
在createWeapon()
的末尾,wp
变量createWeapon()
的局部变量被销毁。因此,返回的指针指向&#34;销毁&#34;宾语。如果您尝试取消引用该指针,程序将处于未定义的行为,这意味着无人知道将会发生什么。
但是,在调用createWeapon()
后,直接,wp
变量可能仍然存在 - 因为尚未触及堆栈帧。这就是您的第一个示例似乎工作的原因。但在第二个示例中,您调用showWeaponInfo()
,并且调用更改堆栈帧。