如果我在下面的代码片段中添加`delete [] d;`,为什么我得零?

s̮̦*_*̥̳̼ -3 c++

如果我添加delete[] d;以下代码片段,为什么我会为零?以下是我在ideone.com上运行的链接:https://ideone.com/WxbaJt

如果我删除了delete[] d;那么答案是正确的(544320).但我想在每个循环中重置数组i.

#include <iostream>
using namespace std;

int main() {
    // your code goes here

    int sum=0;
    int init=10000000;
    int end=99999999;
    int *d=0;

    for (int i=init; i<=end; i++) {
        int j=i;
        d = new int[10];
        while (j>0) {
            d[j%10]++;
            j/=10;
        }
        bool repeat = false;
        for (int k=0;k<=9;k++) {
            if (d[k]>=2) {
                repeat=true;
            }
        }
        if (!repeat) {
            if (i%3==0)
                sum++;
        }
        delete[] d;
    }

    cout << sum;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

Som*_*ude 6

当你分配内存时new[],它将是未初始化的,内存的内容将是不确定的,并以任何方式使用它,除了初始化它将导致未定义的行为.

我建议您使用std::vector而不是使用在每次迭代结束时必须记住释放的动态分配的内存.

您可以使用特定数量的元素创建它,每个元素都初始化为特定值.例如

std::vector<int> d(10);  // Create 10 default-initilized (zero) integers
Run Code Online (Sandbox Code Playgroud)

当循环迭代时,向量超出范围并且其生命周期结束.当循环在下一次迭代中重新开始时,将创建一个新的新矢量.