这似乎应该有一个超级简单的解决方案,但我无法弄明白。我只是创建一个调整大小的数组并尝试复制所有原始值,然后最终删除旧数组以释放内存。
void ResizeArray(int *orig, int size) {
int *resized = new int[size * 2];
for (int i = 0; i < size; i ++)
resized[i] = orig[i];
delete [] orig;
orig = resized;
}
这里似乎发生的是resized[i] = orig[i]
是通过引用而不是值复制值,因为在调整大小后打印orig会返回一堆垃圾值,除非我注释掉delete [] orig
。如何从orig复制大小,或者是否还有其他问题?我不想使用std :: vector。
答案 0 :(得分:8)
请记住,C ++中的参数是按值传递的。您将resized
分配给传递给您的指针的副本,函数外部的指针保持不变。
你应该使用双重间接(或“双指针”,即指向int
的指针):
void ResizeArray(int **orig, int size) {
int *resized = new int[size * 2];
for (int i = 0; i < size; i ++)
resized[i] = (*orig)[i];
delete [] *orig;
*orig = resized;
}
或指针的引用:
void ResizeArray(int *&orig, int size) {
int *resized = new int[size * 2];
for (int i = 0; i < size; i ++)
resized[i] = orig[i];
delete [] orig;
orig = resized;
}
顺便说一下,对于数组大小,你应该使用std::size_t
中的<cstddef>
类型 - 保证保持任何对象的大小,并明确我们正在处理对象的大小
答案 1 :(得分:4)
我强烈建议用std::vector<int>
替换数组。此数据结构将根据需要调整大小,并且已调整大小调整。
答案 2 :(得分:2)
orig
必须是指向指向resized
的指针的指针:
int **orig;
*orig = resized;