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

Tar*_*aru 2 c++ memory arrays expand dynamic

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

int *a = new int[5];
*a = new int[2];
Run Code Online (Sandbox Code Playgroud)

这合法吗?

Rus*_*hPL 9

您无法扩展此类型的动态内存阵列.你可以使用malloc,realloc虽然你需要这个设施,但我会建议反对,并建议包括<vector>和使用std::vector.它有一种resize方法.

此外,您所描述的将无法编译.以下将:

1: int *a = new int[5];
2: a = new int[2];
Run Code Online (Sandbox Code Playgroud)

以上将分配两个内存块,这两个内存块都不会被销毁.第二行将简单地为同一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);
}
Run Code Online (Sandbox Code Playgroud)

值得注意的是,realloc没有做任何聪明的事情.它所做的就是:

  • 分配新的内存块 malloc
  • 将数据从旧内存块复制到新内存块 memcpy
  • 免费旧内存块 free
  • 返回新的内存块

  • "// C++堆上的一切"部分的目的是什么? (2认同)
  • @RushPL:不经常,不.我想不出有时间. (2认同)