你如何在C ++中“重新分配”?
我怎样才能重新realloc
在C + +? 这似乎是缺less的语言 – 有new
和delete
但不能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
。
new
和delete
不能resize,因为它们只分配足够的内存来容纳给定types的对象。 给定types的大小永远不会改变。 有new[]
和delete[]
但几乎没有理由使用它们。
C中的realloc
可能只是一个malloc
, memcpy
和free
,尽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仍然存在的原因。