有没有办法扩展动态内存阵列?像这样:
int *a = new int[5];
*a = new int[2];
这合法吗?
答案 0 :(得分:9)
您无法扩展此类型的动态内存阵列。您可以使用malloc
和realloc
,但如果您需要此工具,我会建议不要这样做并建议包括<vector>
并使用std::vector
代替。它有一个resize
方法。
此外,您所描述的内容无法编译。以下将:
1: int *a = new int[5];
2: a = new int[2];
以上将分配两个内存块,这两个内存块都不会被销毁。第二行将简单地将新数组分配给相同的int *a
指针。当分配的内存停止被任何指针引用时,这称为内存泄漏。上面的代码丢失了对new int[5]
的任何引用,并且无法将此内存释放到操作系统。
虽然这不是一个非常实用的示例,但有多种方法可以调整数组/向量的大小。 由于增加阵列大小通常很实用,我将这样做:
{ // C++ vector on the stack (although internally vector uses memory from the heap)
std::vector<int> a(1024);
// do smth
a.resize(4096); // note: this does not always reallocate
// do smth else
}
{ // C++ everything on the heap
std::vector<int> *a = new std::vector<int>(1024);
// do smth
a->resize(4096); // note: this does not always reallocate
// do smth else
delete a;
}
{ // C style
int *a = (int*)malloc(1024*sizeof(int));
// do smth
a = realloc(a, 4096*sizeof(int));
// do smth else
free(a);
}
值得注意的是realloc
没有做任何聪明的事情。它所做的就是:
malloc
memcpy
free
答案 1 :(得分:1)
你可以当然扩展一个数组,但你需要注意复制内容和释放旧数组(你的代码,除了不正确的语法,收缩数组,顺便说一句。)
std::vector
的工作方式正是如此,只是您无需关心。
所以基本上,已经分配int *a
,需要发生的事情是:
{
std::unique_ptr<int[]> d(a);
a = new int[desired_new_size];
for(unsigned int i = 0; i < min_old_size_and_new_size; ++i)
a[i] = d[i];
}
请注意,严格来说,“扩展”从不真正扩展数组,而是将其替换为另一个更大的数组(对于提供相同功能的任何容器也是如此)。但是这对以后使用指针的任何代码都是透明的,没有人知道。
你应该从不使用realloc
(或任何其他C内存分配函数)与operator new
和delete
分配或释放的内存(或{ {1}}和new[]
)如上所述
这个可以工作(并且通常会),但它在概念上是错误的,如果它没有崩溃,那就是纯粹的运气(未知的实现细节)。