什么是 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,否则请使用mallocreallocfree

并且,为了回答您的最后一个问题,您的代码的 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++ 版本,用于分配新缓冲区并从旧缓冲区复制内容?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 C++ 分配器中没有重新分配功能?

在 C++ 中使用 realloc

内存动态分配之realloc(),malloc(),calloc()与new运算符

我应该为 memcpy 和 realloc 包含啥标题?

如果 Malloc 无法分配 X 字节,我是使用 Realloc 还是再次使用 Malloc? C++

替换 realloc (C --> C++)