这段用于增长数组的c++代码可能会中断吗?
Can this C++ code for growing an array possibly break?
我最终决定永远学习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
进行复制(当然要使用正确的大小)。您最大的问题是您过早地将*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
相关文章:
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 代码在main()中运行,但在函数中出现错误
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- 编译包含字符串的代码时遇到问题
- 我在c++代码中生成了一个运行时#3异常
- 如何在linux终端中同时编译和运行c++代码
- 为cl.exe(Visual Studio代码)指定命令行C++版本
- 在Linux for Windows上编译C++代码时出错
- 我的字符计数代码计算错误.为什么
- 孤立代码块在结构中引发异常
- 在编译C++代码(具有dlib和opencv)到WASM时面临问题
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 此代码是否违反一个定义规则
- 为什么我的代码在输出中增加了93天
- 我的简单if-else语句是如何无法访问的代码
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- 为什么在这个代码结束循环中没有得到结束
- 在c代码之间共享数据的最佳方式
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值