首页 > 解决方案 > 如果我在下面的代码片段中添加 `delete[] d;`,为什么我会得到零?

问题描述

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;
}

标签: c++

解决方案


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

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

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

std::vector<int> d(10);  // Create 10 default-initilized (zero) integers

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


推荐阅读