动态内存调整字符数组

新手上路,请多包涵

我正在尝试调整 char 数组的大小,我遵循: Resizing a char[] at run time

然后:

我做了这样的事情:

 // this crashes in runtime:

const long SIZE_X = 1048576;

char* Buffsz = new char(sizeof(char));

for(int i = 0; i < (SIZE_X - 2); i++)
{
    Buffsz[i] = 'a';
    if(realloc(Buffsz, sizeof(char) * i) == NULL) // autoallocate memory
        cout << "Failled to reallocate memory!" << endl;
}

但如果我这样做:

 // this works without problems.
const long SIZE_X = 1048576;

char* ABuffsz = new char[SIZE_X];

for(int i = 0; i < (SIZE_X - 2); i++)
{
    ABuffsz[i] = 'a';
}

cout << "End success! len: " << strlen(ABuffsz) << endl;

对我来说这应该没问题,但如果它错了,我怎么能自动分配内存?

PS:我知道使用 std::vector 但如果可能的话我想使用它。

原文由 MindLerp 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 294
1 个回答

realloc() 用于调整使用 malloc() 分配的 C 样式数组的大小。 realloc() 不能在 C++ 代码中使用,以调整在动态范围内实例化的 C++ 对象的大小 new

realloc() 在 C++ 中没有等价物。在 C++ 中,调整现有数组大小的最简单方法是:必须在动态范围内构造一个新数组,使用 new [] ,现有数组中的值 std::copy 到新数组,然后是旧数组 delete[] -ed。

这是很多工作。这将涉及很多不必要的默认构造和复制分配(如果你的类没有默认构造函数,你就会被卡住)。使用placement-new 和手动复制/移动构造函数可以优化其中的一些工作。但这是很多工作。这就是为什么你应该使用 std::vector 。它为您完成了所有这些,并且正确地完成了这些。

自己使用 newdelete 没有任何问题,如您所愿。这是一个很好的学习经验,以便了解如何正确管理动态范围的对象。充分了解低级动态范围的工作原理是有价值的知识。然而,在某些时候,所有这些都变得非常陈旧且非平凡的任务,涉及动态范围的对象,变得乏味且容易出错,并且会耗费大量时间。

那时,保持理智的唯一方法是开始使用 C++ 库容器,它会为您处理所有垃圾工作。总之:使用 std::vector ,让它为你完成所有这些工作。

原文由 Sam Varshavchik 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题