我有一个用new分配的字符数组,我想修改数组的大小。我可以使用realloc功能吗?这样做的最佳方法是什么?
答案 0 :(得分:5)
不,你不能...... realloc()
只能与malloc()
/ free()
一起使用
对new[]
已分配数组的最佳调用是创建一个新数组,然后将memcpy()
数据从一个数组创建到另一个数组。
更好的方法 - 如果您知道需要调整大小,请使用std::vector
或std::string
代替数组。在内部,它们几乎是相同的阵列。
答案 1 :(得分:4)
在C ++中,最好使用STL std::vector
类来完成此类操作。要么是,要么是std::string
。
答案 2 :(得分:2)
如果您的数组是动态分配的(realloc()
),则可以使用malloc/calloc/realloc
。如果你有静态数组,则无法调整它的大小。如果你已经分配了new:
int* Copy = new int[newSize];
std::copy(oldCopy,oldCopy+size,Copy);
但最好的方法是使用c ++标准库中的std::vector<type>
答案 3 :(得分:2)
我有一个用new分配的字符数组,我想修改数组的大小。
您无法调整数组大小,您只能分配一个新的,更大的数组,将内容移动到新数组,并删除旧数组。
我可以使用
realloc
功能吗?
如果使用malloc
分配原始数组,是的。但这在C ++中通常是一个坏主意,你通常希望处理非平凡对象的数组而不是原始内存。
最好的方法是什么?
使用std::string
(或者std::vector<char>
)自动管理动态字符数组。这些还具有使用RAII来降低内存泄漏和其他内存管理错误风险的优势。
答案 4 :(得分:0)
正如其他人所说,你不能调整本身分配的数组的大小,但你可以创建一个更大的数组,将第一个数组的内容复制到第二个数组并删除第一个数组。
这是一个例子,使用std :: copy()。
int main(int argc, char** argv) {
int* arr = new int[5];
arr[0] = 1;
arr[1] = 2;
arr[2] = 3;
arr[3] = 4;
arr[4] = 5;
int* tmp = new int[10];
std::copy(arr, arr + 5, tmp);
std::copy(arr, arr, tmp + 5);
delete[] arr;
arr = tmp;
for(int i = 0; i < 10; i++) {
std::cout << arr[i] << "\n";
}
delete[] arr;
std::cin.get();
return 0;
}
这首先创建一个整数数组并填充它。然后它创建一个更大的数组并用第一个数组的内容填充两次并显示新的更大的数组。
字符数组的原理相同。
正如其他人所提到的,在C ++中最好的选择是使用标准库。对于可调整大小的字符数组,您应该使用std :: string或字符串向量,但在某些情况下它有点矫枉过正。