什么是 realloc() 的 C++ 版本,用于分配新缓冲区并从旧缓冲区复制内容?
Posted
技术标签:
【中文标题】什么是 realloc() 的 C++ 版本,用于分配新缓冲区并从旧缓冲区复制内容?【英文标题】:What is C++ version of realloc(), to allocate the new buffer and copy the contents from the old one? 【发布时间】:2013-05-23 13:14:50 【问题描述】:在C中我们使用malloc(), free()
,但在C++中你使用new, delete
,但在C中我们也有realloc
,它将分配新块并复制旧数据(公共最小值),然后释放旧数据数据块。那么它的 C++ 版本是什么?我当然可以自己写,但是有内置的东西吗?
main()
int i; char *x = malloc(3);
x[0] = 10;
x[1] = 20;
x[2] = 30;
realloc(x, 4);
x[3] = 40;
for (i = 0; i < 4; i++) printf("%i\n", x[i]);
【问题讨论】:
C++ 中没有 realloc 等价物。 我会为此使用 std::vector 有谁知道是否有任何 std::vector 实现对 POD 类型使用 C 内存处理? @RossHemsley 我知道!它没有。我围绕 STL 分配器做了一个简单的包装器,它只是从中获取正常的函数调用,但打印有关它们如何被调用的信息。当向量重新分配时,它会分配新数据,复制元素,销毁旧元素,最后释放旧数据。 (如果 realloc 是由 push_back 操作引起的,则在复制旧元素之前在新数据中构造新元素。)请注意,这是在带有 MSVC 的 Windows 10 上,其他地方的行为可能会有所不同。 【参考方案1】:在 C++ 中没有 new
/delete
等效于 realloc
。
来自Bjarne Stroustrup's FAQ:
为什么 C++ 没有 realloc() 的等价物?
如果你愿意,你当然可以使用 realloc()。然而, realloc() 是 只保证在 malloc() 分配的数组上工作(和类似的 函数)包含没有用户定义的复制构造函数的对象。 另外,请记住,与天真的期望相反,realloc() 偶尔会复制它的参数数组。在 C++ 中,一种更好的方法 处理重新分配是使用标准库容器,例如 作为载体,让它自然生长。
如果您想要一个可调整大小的容器,只需使用std::vector
,否则请使用malloc
、realloc
和free
。
并且,为了回答您的最后一个问题,您的代码的 C++ 版本将是:
main()
std::vector<char> x(3);
x[0] = 10;
x[1] = 20;
x[2] = 30;
x.resize(4);
x[3] = 40;
for (int i = 0; i < 4; i++) std::cout << x[i] << std::endl;
【讨论】:
【参考方案2】:让我们看看 Bjarne Stroustrup 是怎么想的!
Why doesn't C++ have an equivalent to realloc()?
如果你愿意,你当然可以使用 realloc()。然而, realloc() 是 只保证在 malloc() 分配的数组上工作(和类似的 函数)包含没有用户定义的复制构造函数的对象。 另外,请记住,与天真的期望相反,realloc() 偶尔会复制它的参数数组。
在 C++ 中,处理重新分配的更好方法是使用标准 库容器,比如vector,让它自然生长。
【讨论】:
【参考方案3】:C++ 没有与 C 的 realloc
等效的 new/delete
。
可能的原因(尽管标准中没有提到)是因为构造函数可以抛出:如果在重新分配时构造函数抛出,它应该如何表现?这种情况的处理最好留给程序员,因为没有一个真正的答案。
【讨论】:
【参考方案4】:realloc
未在 C++ 中使用,因为 C++ 通常希望将其副本和默认构造函数和析构函数用于此类事情。但是,如果您想要尽可能快地处理普通的旧类型,那么没有理由不推出自己的数组类来满足您的需求。令我惊讶的是,在 Google 的顶部页面中还没有一个与 STL 大部分兼容的版本。
【讨论】:
以上是关于什么是 realloc() 的 C++ 版本,用于分配新缓冲区并从旧缓冲区复制内容?的主要内容,如果未能解决你的问题,请参考以下文章
内存动态分配之realloc(),malloc(),calloc()与new运算符