4

我有一个 C++ 中的基本程序,它列出了给定数量的素数。完成工作的类如下 - 我的问题是,当“数量”的输入为 10(特别是 10 - 它适用于我尝试过的所有其他数字)时,下面生成的数组未初始化为一个零数组。因此,“数组的最后一个元素为空”返回 false,我的代码无法正常运行。

我不知道我是否误解了,但是 int 数组不应该初始化为零吗?如果不是,整数 10 有什么特别之处导致它初始化为奇怪的值?

int* primecalc(int amount) {

int* primes = new (nothrow) int [amount];

//Throw an error if we can't allocated enough memory for the array.
if (primes==0) {
cout<< "Error allocating memory.";
return 0;
}

//Otherwise, start iterating through the numbers.
else {
primes[0] = 2;
primes[1] = 3;

int p = 2;

for (int i=4;primes[amount]==0;i++) {
int j = 0;
int k = 0;

    while ((primes[j]<=floor(i/2)) && !(primes[j]==0) && (k==0)) {

        if ((i % primes[j]) == 0) {
        k=1;
        } 
    j++;
    } //end the while loop

if (k==0) {
        primes[p] = i;
        p++;

}

} //end the for loop

} //end the "else" part (this was only necessary in case memory could not be allocated)

return primes;
}

我也尝试不使用(nothrow),结果相同。提前感谢您的帮助!

4

2 回答 2

13

int* primes = new (nothrow) int[amount];正在使用default-initialization,对于标量来说,它int是一个 noop (即不执行实际初始化)。

如果要显式初始化,请改用值初始化

int* primes = new (nothrow) int[amount]();

来自 C++11 标准,§8.5/6:

默认初始化类型的对象T意味着:

  • 如果T是(可能是 cv 限定的)类类型,则调用 T 的默认构造函数(如果 T 没有可访问的默认构造函数,则初始化是非良构的);
  • 如果T是数组类型,每个元素都是默认初始化的
  • 否则,不执行初始化

如果程序要求对 const 限定类型的对象进行默认初始化TT则应是具有用户提供的默认构造函数的类类型。

§8.5/7:

对类型对象进行值初始化T意味着:

  • ifT是具有用户提供的构造函数的(可能是 cv 限定的)类类型,T则调用 for 的默认构造函数(如果 T 没有可访问的默认构造函数,则初始化格式错误);
  • ifT是没有用户提供的构造函数的(可能是 cv 限定的)非联合类类型,则该对象被零初始化,并且如果T' 的隐式声明的默认构造函数不平凡,则调用该构造函数。
  • 如果T是数组类型,则每个元素都是值初始化的
  • 否则,对象是零初始化的

一个被值初始化的对象被认为是被构造的,因此受制于适用于“构造的”对象、“构造函数已完成的对象”等的本国际标准的规定,即使没有为对象的构造函数调用构造函数。初始化。

§8.5/6:

对类型的对象或引用进行零初始化T意味着:

  • 如果T是标量类型,则将对象设置为值0(零),作为整数常量表达式,转换为T
  • 如果T是(可能是 cv 限定的)非联合类类型,则每个非静态数据成员和每个基类子对象都被初始化为零并且填充被初始化为零位;
  • 如果T是(可能是 cv 限定的)联合类型,则对象的第一个非静态命名数据成员初始化为零,填充初始化为零位;
  • 如果T是数组类型,则每个元素都初始化为零
  • 如果T是引用类型,则不执行初始化。

最后从 §8.5/10 开始:

初始化器是一组空括号的对象,即 ,()应进行值初始化。

(所有的重点都是我的。)

于 2012-08-04T23:19:10.817 回答
3

这样做只是为了提高效率。并非在所有情况下,数组都必须预先填充一个值,因此 C++ 默认情况下不会这样做。

如果你使用std::vector<int>而不是普通数组(我建议你这样做),你有一个构造函数来设置一个可以为 0 的初始值:

std::vector<int> v(10,0);  // 10 elements with 0
于 2012-08-04T23:17:45.147 回答