【发布时间】:2018-12-17 05:59:02
【问题描述】:
据我所知,C++ 中的 realloc 和 C 没有确切的替代方案,就像 new 中的 malloc 一样。但是,当我在C++ 中使用realloc 来更改new 运算符分配的内存时,它可以正常工作。
像我在下面的代码中那样使用这两个(new 和 realloc)是否安全,否则会导致一些问题?
#include <iostream>
#include <cstdlib>
int main()
{
int size = 5;
int * arr = new int[size]{ 1,3,5,7,9 };
for (int i = 0; i < size; i++)
std::cout << *(arr + i) << (i < size - 1 ? ' ' : '\n');
size++;
arr = (int*)realloc(arr, size * sizeof(int));
*(arr + size - 1) = 11;
for (int i = 0; i < size; i++)
std::cout << *(arr + i) << (i < size - 1 ? ' ' : '\n');
delete[] arr;
//free(arr);
std::cin.get();
return 0;
}
另外,在这种情况下我应该使用哪个运算符来释放内存:delete[] of free()?
【问题讨论】:
-
无,改用
std::vector -
运行时库不会故意让这个失败。然而,当元素类型是 C++ 对象(如 std::string)时,它会燃烧 UB。内部指针不会更新。
-
@HansPassant 为什么会有人用
std::string来做这件事?或者确实是任何类型的库对象?一切都会失去,没有收获(除非你完全误解了std::vector或std::array)。 -
而且,有趣的是,因为
new和malloc从不同的堆分配,“编辑 n 继续”在 VS2015 中不起作用,我认为是,因为 - 正如我在展会后发现的那样一点点挖掘——一些东西被分配给malloc,后来被delete释放。我修补了mspdsrv并以我的快乐方式航行(后来修复了)。具有讽刺意味的是,这个 bug 被一些无效的参数处理逻辑“吞噬”了,所以制作这个 boo-boo 的开发人员从未看到任何证据(除了他的代码实际上没有工作的事实)。