什么是realloc()的C++版本,分配新缓冲区并复制旧缓冲区中的内容?

exe*_*ook 21 c++ malloc

在我们使用的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]);
}
Run Code Online (Sandbox Code Playgroud)

zak*_*ter 31

在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;
}
Run Code Online (Sandbox Code Playgroud)


mas*_*oud 22

让我们看看Bjarne Stroustrup的想法!

为什么C++没有与realloc()相同的东西?

如果你愿意,你当然可以使用realloc().但是,realloc()仅保证对包含没有用户定义的副本构造函数的对象的malloc()(和类似函数)分配的数组起作用.此外,请记住,与天真的期望相反,realloc()偶尔会复制其参数数组.

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