25

在 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]);
}
4

4 回答 4

39

在 C++ 中没有new/delete等价的。realloc

来自Bjarne Stroustrup 的常见问题解答

为什么 C++ 没有等价于 realloc()?

如果你愿意,你当然可以使用 realloc()。但是,realloc() 只能保证在 malloc()(和类似函数)分配的数组上工作,这些数组包含没有用户定义的复制构造函数的对象。另外,请记住,与天真的期望相反,realloc() 偶尔会复制其参数数组。在 C++ 中,处理重新分配的更好方法是使用标准库容器,例如 vector,并让它自然增长。

如果您想要一个可调整大小的容器,只需使用std::vector,否则请使用malloc,reallocfree

而且,要回答您的最后一个问题,您的代码的 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;
}
于 2013-05-23T13:17:34.240 回答
24

让我们看看 Bjarne Stroustrup 是怎么想的!

为什么 C++ 没有等价于 realloc()?

如果你愿意,你当然可以使用 realloc()。但是,realloc() 只能保证在 malloc()(和类似函数)分配的数组上工作,这些数组包含没有用户定义的复制构造函数的对象。另外,请记住,与天真的期望相反,realloc() 偶尔会复制其参数数组。

在 C++ 中,处理重新分配的更好方法是使用标准库容器,例如 vector,并让它自然增长。

于 2013-05-23T13:21:42.750 回答
3

C++ 没有new/deleteC 的等价物realloc

可能的原因(尽管标准中没有提到它)是因为构造函数可以抛出:如果在重新分配时构造函数抛出,它应该如何表现?这种情况的处理最好留给程序员,因为没有一个真正的答案。

于 2013-05-23T13:18:55.343 回答
3

realloc不在 C++ 中使用,因为 C++ 通常希望将其副本和默认构造函数和析构函数用于此类事情。但是,如果您想要尽可能快地处理普通的旧类型,那么没有理由不推出您自​​己的数组类来满足您的需求。我很惊讶在 Google 的顶部页面中没有一个与 STL 兼容的大部分内容。

于 2014-09-15T05:29:12.600 回答