有没有办法在C ++中扩展动态内存数组?

时间:2011-10-06 16:19:07

标签: c++ arrays memory dynamic expand

有没有办法扩展动态内存阵列?像这样:

int *a = new int[5];
*a = new int[2];

这合法吗?

2 个答案:

答案 0 :(得分:9)

您无法扩展此类型的动态内存阵列。您可以使用mallocrealloc,但如果您需要此工具,我会建议不要这样做并建议包括<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 newdelete分配或释放的内存(或{ {1}}和new[])如上所述 这个可以工作(并且通常会),但它在概念上是错误的,如果它没有崩溃,那就是纯粹的运气(未知的实现细节)。