这段用于增长数组的c++代码可能会中断吗?

Can this C++ code for growing an array possibly break?

本文关键字:代码 c++ 中断 数组 段用于 用于      更新时间:2023-10-16

我最终决定永远学习C++,我在一本增加数组大小的书中遇到了下面的代码。该函数接受一个指向数组大小的指针,并返回一个大小为原来的两倍的新数组。

int *doubleArraySize(int *p_array, int *p_size) {
    *p_size *= 2;
    int *p_new_array = new int[*p_size];
    for(int i = 0; i < *p_size; i++)
        p_new_array[i] = p_array[i];
    delete[] p_array;
    return p_new_array;
}

到达for循环时,*p_size的值已经翻倍了。这意味着(至少对我来说),当我们访问p_array[i]时,我们最终进入了不属于p_array的内存区域。这是个问题吗?这段代码会崩溃吗?如果不是,我错过了什么?

这不是安全的代码。您从p_array复制超出其限制(如果它是以前的*p_size)。虽然可能不会崩溃,但它仍然是未定义行为

我有两个建议:

  1. 使用std::vector !
  2. 如果没有,那么至少使用std::copy_n进行复制(当然要使用正确的大小)。

您最大的问题是您过早地将*p_size乘以2,因此您在for循环中读取了旧数组的末尾。

您可以通过将乘法延迟到副本之后来解决此问题:

int extend_arr(int *old, size_t *sz)
{
    int *newarr = new int[*sz * 2];
    for (size_t i = 0; i < *sz; i++)
        newarr[i] = old[i];
    *sz *= 2;
    return newarr;
}

和通常的警告:为什么不使用std::vector代替?对于vector,您只需将其resize(),并让标准库完成艰苦的工作。

new会失败并抛出异常。

指针也有可能为NULL