在堆腐的情况下,可以新的投掷吗?
如果我正确理解,在堆腐败的情况下,所有赌注都会关闭,任何事情都可能发生.它是否正确?
解决方法
(从Als的建议中的评论移动到答案,并延伸到更好或更差:-))
损坏的堆将使您对程序的任何行为期望无效.至关重要的是,抛出异常意味着一些可靠的程序化处理是可行的,但是没有实现检测堆损坏可能会知道这是否是真的,因此它们更有可能被断言或类似.
如果我们考虑堆可能有什么类型的损坏:
>与堆的当前状态相关的损坏的记录.
>分配和/或免费列表.腐败可能意味着以后的堆分配取消引用无效指针,堆的某些部分泄漏批发,在新的/新的[] / delete / delete [] / malloc / realloc / free循环无限循环中调用的更晚的堆分配或释放算法等等..
>同步对象执行堆例程所使用的互斥体,条件变量等的状态可能会被破坏,导致死锁,竞争条件以及相关函数调用期间的后续故障.
>记录由new []构建的数组元素的数量:腐败意味着delete []将破坏错误的元素数量.如果数量减少,某些对象不会被破坏,可能会导致内存泄漏,指针丢失,引用计数器递减,文件句柄保持打开,互斥锁锁定,共享内存段未被破坏等.增加,删除[]可能访问包含数组的内存 – 可能导致SIGSEGV – 调用析构函数相当于reintrepet_cast&的内存内容作为要销毁的对象.这可能会尝试取消引用/删除/释放无效指针,关闭“随机”文件句柄等.
>申请资料
>应用程序本身通过new和new []创建的对象可能会被损坏,破坏程序状态,包含的指针和句柄等.问题可能会以任何方式显示出来.
更一般地说,关于堆,在最好的情况下,您可以希望新的将在堆耗尽时抛出,但即使远远没有保证 – 特别是在只有虚拟内存被新分配的操作系统上,如果后续页面错误不能满足他们表现为SIGSEGV或类似的.