我最终决定永远学习 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
)。虽然它可能不会崩溃,但它仍然是未定义的行为。
我有两个建议:
- 使用
std::vector
! - 如果没有,那么至少使用
std::copy_n
用于复制(当然尺寸要正确)。
关于c++ - 这个用于增长数组的 C++ 代码可能会中断吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17003651/