首页 > 解决方案 > 即使 realloc() 在 C++ 中失败,如何重新分配内存

问题描述

使用 malloc() 成功分配后,有时程序需要增加数组的大小。虽然 malloc() 成功,但realloc()失败。

我已经使用这段代码来处理 realloc() 的失败。这里T是模板参数。array是 T 类型的指针,_size是数组已被使用的总索引,_maxSize是可用索引的最大数量。 当 _size 达到 _maxSize 时需要重新分配

if(_size == _maxSize){
    _maxSize *= 2;
    T *temp;
    temp = (T *) realloc( array, sizeof( T ) * (_maxSize) ) ;
    if(temp == NULL){
        printf("...reallocation of memory failed...\n");
        exit(0);
    }
    else{
        array = temp;
    }
}

虽然处理了 realloc() 的失败,但程序确实需要增加数组大小,即使 realloc() 失败,我也不知道如何执行重新分配。

标签: c++pointersdynamic-memory-allocationrealloc

解决方案


即使 realloc() 在 C++ 中失败,如何重新分配内存

在真正的 C++ 中,您永远不会使用mallocorrealloc,只是new(在您的C++ 标准库实现中实现,并将在malloc内部调用!)和delete(它通常调用free),最好是标准容器智能指针。内存不足的情况由异常(例如std::bad_alloc)处理,您可以处理catch这些异常。

在 C 语言中,稳健的解决方案是不使用realloc而只使用malloc, calloc, andfreememset清除区域并memcpy复制它)。

真正的问题是如何巧妙地处理内存不足的情况。这是一个设计问题,并且是特定于应用程序的。注意记忆垃圾收集技术、概念和术语。请注意,引用计数是一种原语,但在 C++ 中经常使用垃圾收集技术。因此,请阅读GC 手册或至少阅读跟踪垃圾收集维基页面,了解它将教给您的概念。

注意内存过度使用。这是我不喜欢的操作系统功能。

还要注意mallocand free(在您的C 标准库实现中实现)正在使用操作系统原语(通常是系统调用)。因此,请阅读有关操作系统的更多信息,例如操作系统:三个简单的部分。在 Linux 上,这些操作系统原语(通常)是mmap(2)munmap(2)。因为系统调用代价高昂,你的标准库会尽量避免它们,并且更喜欢将free-d 内存区域标记为在未来malloc-s 中可重用。

使用valgrind寻找内存泄漏。您宁愿在某些Linux 发行版上开发 C++ 代码,只是为了拥有valgrind. 我的看法是 Linux 提供了一个对开发人员非常友好的软件环境,因此我向大多数程序员和学生推荐 Linux。不要忘记编译g++ -Wall -g(也许-O2在基准测试时)并在需要时使用address sanitizer

更一般地,请阅读http://norvig.com/21-days.html - 它提供了一个绝妙的见解。


推荐阅读