有没有一种方法可以扩展动态内存数组?就像这样:
int *a = new int[5];
*a = new int[2];
这合法吗?
你无法扩展这种类型的动态内存数组。但如果你需要这个功能,可以使用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
std::vector
将使用复制/移动运算符,而任何 C 风格的版本对于非 POD 类型会产生未定义行为。 - spraff// C++ everything on the heap
" 这个部分的目的是什么? - GManNickGmalloc
需要使用free
释放内存,而不是delete
。 - Robᵩ你可以扩展一个数组,但是你需要注意复制内容和释放旧数组(顺便说一下,你的代码除了语法错误外还缩小了数组)。
这正是 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];
}
std::vector<int>
。 - GManNickGint *
到int
没有隐式转换。 - Matteo Italiastd::vector<T>
提供了自动调整大小的功能,您无需担心。与 C 语言中的realloc()
函数不同,C++ 中没有标准构造函数可重新分配使用new
分配的内存,因此通常情况下需要使用new
分配更多内存,将旧数据块中的数据复制到新块中,然后释放旧指针使用delete
。 - wkl