我遇到了一些奇怪的事情:一个数组“new”-ed in heap with random values ...
我使用以下代码进行了测试:
class Solution_046 {
public:
vector<vector<int>> permute(vector<int>& nums) {
vector<vector<int>> rst;
int sz = nums.size();
if(sz)
{
vector<int> group;
int* inuse = new int[sz];
cout<<"--------- inuse ------------"<<endl;
for(int ii=0; ii<sz; ++ii)
//inuse[ii]=0, cout<<inuse[ii]<<", ";
cout<<inuse[ii]<<",, ";
cout<<endl;
//......
}
return rst;
}
};
int main()
{
Solution_046 s046;
vector<int> vv;
vv.push_back(1);
vv.push_back(2);
vv.push_back(3);
vv.push_back(4);
vv.push_back(5);
vv.push_back(6);
vv.push_back(7);
vector< vector<int> > rst = s046.permute(vv);
return 0;
}
如果我禁用那些“vv.push_back(...)”中的一行或两行,那么打印的结果将包含一些随机值而不是全部为零:
$ ./nc (with all 7 lines)
--------- inuse ------------
0,, 0,, 0,, 0,, 0,, 0,, 0,,
$ ./nc (disalbed one line)
--------- inuse ------------
29339680,, 0,, 4,, 5,, 0,, 0,,
$ ./nc (disabled two lines)
--------- inuse ------------
26095648,, 0,, 5,, 6,, 0,,
$ ./nc (disabled three lines)
--------- inuse ------------
0,, 0,, 0,, 0,,
$ ./nc (disabled four lines)
--------- inuse ------------
0,, 0,, 0,, 0,,
$ ./nc (disabled five lines)
--------- inuse ------------
0,, 0,,
$ ./nc (disabled six lines)
--------- inuse ------------
0,,
禁用一行或两行时发生了什么,为什么“new”-ed数组中存在非零值?
答案 0 :(得分:7)
int* inuse = new int[sz];
此调用将为int
数组分配内存,但不会对内容进行值初始化。如果要使用零初始化,请使用以下语法:
int* inuse = new int[sz]();
int* inuse = new int[sz]{}; //c++11
答案 1 :(得分:3)
初始化为零是任意的,通常是不必要的,并且不是特别便宜的开销。因此默认情况下语言不会这样做。
使用尚未初始化的数组元素是C ++中未定义的行为。
您可以在{}
:new
之后使用new int[sz]{};
强制零初始化。正式将内存块设置为零。