动态内存调整char数组

时间:2016-11-25 03:42:30

标签: c++ c++14 dynamic-memory-allocation

我正在尝试调整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但我希望在可能的情况下使用它。

3 个答案:

答案 0 :(得分:2)

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

C ++中没有realloc()的等价物。在C ++中,调整现有数组大小的最简单方法是:必须在动态作用域中使用new []构建新数组,将现有数组std::copy中的值编译为新数组,然后执行旧数组delete[] - 编辑

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

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

在这一点上,保留一个人理智的唯一方法就是开始使用C ++库容器,这些容器可以为你完成所有垃圾工作。总之:使用std::vector,让它为您完成所有这些工作。

答案 1 :(得分:1)

要使用realloc,必须使用malloc或该系列中的其他功能分配内存。

在C ++中处理char字符串的最简单方法是使用std::string

答案 2 :(得分:1)

您不能在使用realloc()运算符的指针分配内存上使用new。您可以使用此函数调整指针的大小

char* Resize(char*& old,long int length,long int resize_to)
{
    char* new_ptr;
    new_ptr = new char[ resize_to ];
    long int least = ( length < resize_to ) ? length : resize_to;
    for(long int i = 0;i < least ; ++i)
        new_ptr [i] = old[i];
    delete [] old;
    old = nullptr;
    return new_ptr;
}

这可能会工作,不要忘记delete[]在不再需要指针后重新分配指针,否则你将不得不担心内存泄漏

虽然您可能希望我们std::stringstd::vector或创建您自己的动态扩展Stack类。