当它耗尽类似于malloc
的可用内存时,它是否会失败,还是有其他原因?
任何分配函数( malloc
, realloc
, calloc
和on POSIX, posix_memalign
)都可能由于以下任何原因而失败,可能还有其他原因:
请注意,严格来说,分配函数可以随时出于任何原因而失败。 最小化失败是一个实施质量问题。 即使减小对象的大小, realloc
也可能会失败; 这可能发生在严格按大小分配分配的实现上。 当然,在这种情况下,您可以继续使用旧的(较大的)对象。
您应该将realloc
视为以这种方式工作:
void *realloc(void *oldptr, size_t newsize) { size_t oldsize = __extract_size_of_malloc_block(oldptr); void *newptr = malloc(newsize); if (!newptr) return 0; if (oldsize > newsize) oldsize = newsize; memcpy(newptr, oldptr, oldsize); free(oldptr); return newptr; }
实现可能能够比这更有效地执行特定情况,但是完全如所示的实现是100%正确的。 这意味着realloc(ptr, newsize)
可能会在malloc(newsize)
失败的任何时候失败; 特别是即使你缩小了分配,它也会失败。
现在,在现代桌面系统上,有一个很好的例子,即不尝试从malloc
故障中恢复,而是将malloc
包装在一个函数(通常称为xmalloc
)中,如果malloc
失败,它会立即终止程序; 自然地,相同的论点适用于realloc
。 案例是:
参数1和2不适用于嵌入式或移动系统(但是!),但参数3在那里仍然有效。
参数3仅适用于必须在每个呼叫站点检查和传播分配失败的程序。 如果您非常幸运地使用C ++,因为它打算使用(即有例外),您可以依赖编译器为您创建错误恢复路径,因此测试负担大大减少。 在任何现在都值得使用的更高级别的语言中,您既有例外又有垃圾收集器,这意味着即使您愿意也不必担心分配失败。
我会说它主要是针对具体实现的。 某些实现可能很可能失败。 有些人可能会在realloc之前使程序的其他部分失败。 始终保持防御并检查它是否失败。
并记得释放你试图重新分配的旧指针。
ptr=realloc(ptr,10);
总是存在内存泄漏。
总是这样做:
void *tmp=ptr; if(ptr=realloc(ptr,10)==NULL){ free(tmp); //handle error... }
你有两个问题。
在大多数现代系统中, malloc
或realloc
失败的可能性微不足道。 只有在虚拟内存不足时才会出现这种情况。 您的系统将无法访问内存而无法保留。
Wrt故障realloc
和malloc
几乎相同。 realloc
可能另外失败的唯一原因是你给它一个不好的参数,那就是没有用malloc
或realloc
分配的malloc
或之前已经free
d的malloc
。
编辑:鉴于R.的评论。 是的,您可以配置系统,使其在分配时失败。 但首先,AFAIK,这不是默认值。 它需要以这种方式配置的权限,作为应用程序程序员,这不是你可以依赖的。 其次,即使你有一个以这种方式配置的系统,这只会在你的可用交换空间被吃掉时出错。 通常,您的机器在此之前很久就会无法使用:它将在您的硬盘上进行机械计算(AKA交换)。
需要了解更多c/c++开发分享realloc失败的几率是多少?,也可以关注C/ C++技术分享栏目—计算机技术网(www.ctvol.com)!
以上就是c/c++开发分享realloc失败的几率是多少?相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/978991.html