怎么解释这个?一个“新”-ed数组没有初始化......?

时间:2015-07-20 09:09:15

标签: c++ arrays memory-management

我遇到了一些奇怪的事情:一个数组“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数组中存在非零值?

2 个答案:

答案 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]{}; 强制零初始化。正式将内存块设置为零。