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

标签 c++ arrays memory-leaks dynamic-memory-allocation

我最终决定永远学习 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用于复制(当然尺寸要正确)。

关于c++ - 这个用于增长数组的 C++ 代码可能会中断吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17003651/

相关文章:

c++ - 已排序数组的一部分被反转

arrays - Racket 中的 String-ref -- #\mean 是什么意思?

c++ - 依赖于操作系统的 C++ 内存泄漏?

c++ - 为什么这不是 C++ 中的内存泄漏?

c++ - std::async过多参数

c++ - C++ 打印 → 在 Windows 控制台上

c++ - 旋转 QLabel 并保留其功能/样式表

c++ - 在另一个类中使用模板类的 typedef

Javascript 计算具有点符号的对象的键

iphone - NSString stringWithUTF8String 内存泄漏