c++ - 即使 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() 失败,我也不知道如何执行重新分配。
解决方案
即使 realloc() 在 C++ 中失败,如何重新分配内存
在真正的 C++ 中,您永远不会使用malloc
orrealloc
,只是new
(在您的C++ 标准库实现中实现,并将在malloc
内部调用!)和delete
(它通常调用free
),最好是标准容器和智能指针。内存不足的情况由异常(例如std::bad_alloc
)处理,您可以处理catch
这些异常。
在 C 语言中,稳健的解决方案是不使用realloc
而只使用malloc
, calloc
, andfree
(memset
清除区域并memcpy
复制它)。
真正的问题是如何巧妙地处理内存不足的情况。这是一个设计问题,并且是特定于应用程序的。注意记忆和垃圾收集技术、概念和术语。请注意,引用计数是一种原语,但在 C++ 中经常使用垃圾收集技术。因此,请阅读GC 手册或至少阅读跟踪垃圾收集维基页面,了解它将教给您的概念。
注意内存过度使用。这是我不喜欢的操作系统功能。
还要注意malloc
and 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 - 它提供了一个绝妙的见解。
推荐阅读
- java - @Embedded 对象在私有时不保存
- docker - 通过 GitLab 容器注册表构建 Docker 失败
- angular - 如何在打字稿中处理循环依赖数据结构
- json - Google Classroom Restful API - 上交作业
- node.js - 找不到 $geoNear 查询的索引,代码:2,代号:'badValue'
- angular - 路由更改后可观察对象未重置为初始状态?
- ruby-on-rails - 将 Factory Bot 添加到 Rails 测试套件会破坏它
- java - 如何对多个条件使用相同的参数
- html - 在 Ruby 中插入 HTML 文件
- reporting-services - FetchXML 有办法随机排序记录吗?