gpt4 book ai didi

c++ - 如何重新分配内存,即使 c++ 中的 realloc() 失败

转载 作者:太空狗 更新时间:2023-10-29 20:19:45 27 4
gpt4 key购买 nike

使用 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() 失败了如何执行重新分配。

最佳答案

How to reallocate memory anyhow, even if realloc() failed in c++

在真正的 C++ 中,您永远不会使用 mallocrealloc,只是 new (在您的 C++ standard library 实现中实现,并将在内部调用 malloc!)和 delete (它通常调用 free),最好是 standard containerssmart pointers .内存不足的情况由异常处理(例如 std::bad_alloc ),您可以 catch这些异常(exception)情况。

在 C 语言中,可靠的解决方案是不使用 realloc,而只使用 malloccalloc free(使用memset清除区域,使用memcpy复制)。

真正的问题是如何巧妙地处理内存不足的情况。这是一个设计问题,并且是特定于应用程序的。注意 memoization garbage collection技术、概念和术语。观察 reference counting是一种原始的,但经常在 C++ 中使用的垃圾收集技术。所以阅读 GC handbook或者至少是 tracing garbage collection它将教给您的概念的维基页面。

注意 memory over-commitment .这是我不喜欢的操作系统功能。

还要注意 mallocfree(在您的 C standard library 实现中实现)正在使用操作系统原语(通常是 system calls )。所以阅读更多关于操作系统的信息,例如Operating Systems: Three Easy Pieces .在 Linux 上,这些操作系统原语(通常)是 mmap(2)munmap(2) .由于系统调用的成本很高,您的标准库会尽量避免它们,并且更愿意将 free-d 内存区域标记为可在未来的 malloc-s 中重用。

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

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

关于c++ - 如何重新分配内存,即使 c++ 中的 realloc() 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56662671/

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