gpt4 book ai didi

c++ - 动态内存调整字符数组大小

转载 作者:行者123 更新时间:2023-11-30 01:41:48 25 4
gpt4 key购买 nike

我正在尝试调整 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;

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

P.S:我知道可以使用 std::vector 但我想尽可能使用它。

最佳答案

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

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

工作量很大。这将涉及很多不必要的默认构造和复制赋值(如果您的类没有默认构造函数,您就会陷入困境)。使用 placement-new 和手动复制/移动构造函数可以优化其中的一些工作。但这是很多工作。这就是您应该使用 std::vector 的原因。它会为您做这一切,而且会正确地做到这一点。

您自己使用newdelete 没有任何问题,就像您想做的那样。这是很好的学习经验,以便了解如何正确管理动态作用域的对象。充分了解低级动态作用域的工作原理是很有值(value)的知识。然而,在某些时候,所有这些都变成了真正的旧的、重要的任务,涉及动态范围的对象,变得乏味且容易出错,并且是一个主要的时间燃烧器。

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

关于c++ - 动态内存调整字符数组大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40797366/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com