c/c++语言开发共享realloc失败的几率是多少?

当它耗尽类似于malloc的可用内存时,它是否会失败,还是有其他原因?

    任何分配函数( mallocrealloccalloc和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... } 

    你有两个问题。

    在大多数现代系统中, mallocrealloc失败的可能性微不足道。 只有在虚拟内存不足时才会出现这种情况。 您的系统将无法访问内存而无法保留。

    Wrt故障reallocmalloc几乎相同。 realloc可能另外失败的唯一原因是你给它一个不好的参数,那就是没有用mallocrealloc分配的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

      (0)
      上一篇 2021年12月12日
      下一篇 2021年12月12日

      精彩推荐