你如何在C ++中“重新分配”?

我怎样才能重新realloc在C + +? 这似乎是缺less的语言 – 有newdelete但不能resize

我需要它,因为随着我的程序读取更多的数据,我需要重新分配缓冲区来保存它。 我不认为delete旧的指针和new更大的指针是正确的select。

使用:: std :: vector!

 Type* t = (Type*)malloc(sizeof(Type)*n) memset(t, 0, sizeof(Type)*m) 

 ::std::vector<Type> t(n, 0); 

然后

 t = (Type*)realloc(t, sizeof(Type) * n2); 

 t.resize(n2); 

如果你想将指针传入函数,而不是

 Foo(t) 

使用

 Foo(&t[0]) 

这是绝对正确的C ++代码,因为vector是一个智能的C数组。

正确的选项可能是使用一个容器为你做的工作,如std::vector

newdelete不能resize,因为它们只分配足够的内存来容纳给定types的对象。 给定types的大小永远不会改变。 有new[]delete[]但几乎没有理由使用它们。

C中的realloc可能只是一个mallocmemcpyfree ,尽pipe如果有足够的连续空闲内存可用,内存pipe理器可以做一些聪明的事情。

在C ++中resize是棘手的,因为可能需要调用构造函数和析构函数。

我不认为有一个根本的原因,为什么在C + +中,你不能有一个resize[]运算符去与new[]delete[] ,做了类似这样的事情:

 newbuf = new Type[newsize]; std::copy_n(oldbuf, std::min(oldsize, newsize), newbuf); delete[] oldbuf; return newbuf; 

很明显, oldsize将从一个秘密的位置检索,它在delete[]Type将来自操作数的types。 如果Type不可复制, resize[]会失败 – 这是正确的,因为这样的对象根本就不能被重定位。 最后,上面的代码默认 – 在分配对象之前构造对象,而不会将其作为实际行为。

newsize <= oldsize有一个可能的优化,可以调用析构函数来parsing新装入的数组中的对象“结束”,除此之外别无其他。 标准将不得不定义是否需要优化(如resize()向量resize()时),允许但未指定,允许但取决于实现或禁止。

那么你应该问自己的问题是:“提供这个是否真的有用,给定的vector也是这样做的,并且是专门devise用于提供可resize的容器(连续内存的 – C ++ 98中省略的要求但用C ++ 03修正),这比使用C ++方法处理数组更好?

我认为答案被广泛认为是“不”。 如果你想以C的方式调整可resize的缓冲区,可以使用C ++中提供的malloc / free / realloc 。 如果你想用C ++的方式来调整可resize的缓冲区,可以使用一个向量(或者如果你实际上不需要连续存储的话就是deque )。 除非你正在实现一个类似于向量的容器,否则不要试图通过使用new[]来混合原始缓冲区。

尝试这样的事情:

 typedef struct Board { string name; int size = 0; }; typedef struct tagRDATA { vector <Board> myBoards(255); // Board DataBoard[255]; int SelectedBoard; } RUNDATA; 

vector会抱怨。 这就是为什么数组,malloc和new仍然存在的原因。