在下面的代码中,行to_string(foo1->_bar[0])
返回"0"
,正如人们所期望的那样。但是,行to_string(foo2->_bar[0])
返回一些其他(看似随机的)整数。为什么是这样?我该怎么做才能使代码以预期的方式起作用? (即,使Foo
的默认构造函数将等于{0}
的整数数组分配给_bar
。)
#include <iostream>
using namespace std;
class Foo {
public:
int* _bar;
Foo() {
int bar[1] = {0};
this->_bar = bar;
}
Foo(int* bar) {
this->_bar = bar;
}
};
int main()
{
int bar[1] = {0};
Foo* foo1 = new Foo(bar);
cout << to_string(foo1->_bar[0]) << "\n";
Foo* foo2 = new Foo();
cout << to_string(foo2->_bar[0]) << "\n";
return 0;
}
答案 0 :(得分:3)
在foo2
情况下,bar[1]
是构造函数内部的局部数组变量。构造函数结束后将无法访问。
由于您将其存储为指针,因此当堆栈上的该空间用于其他任何用途时,您将从该位置获取数据;可能是垃圾。
如果构造函数中的bar[1]
是一个static
变量,它将为您工作。当然,我知道这只是测试代码,您不会在真实代码中这样做。
答案 1 :(得分:1)
在默认构造函数的情况下,您将bar [1]声明为构造函数的局部变量,而this-> _ bar指向bar的内存位置。由于bar [1]范围在构造函数的最后一行结束,因此foo2将指向某个垃圾值而不是0。您可以执行类似操作或将bar [1]声明为静态变量。
class Foo {
public:
int* _bar;
int bar = 0;
Foo() {
this->_bar = &bar;
}
Foo(int* bar) {
this->_bar = bar;
}
};