使用新的内存分配失败

Posted

技术标签:

【中文标题】使用新的内存分配失败【英文标题】:Memory allocation failure using new 【发布时间】:2016-01-05 12:35:38 【问题描述】:

我已经使用 operator new 分配了内存。需要分配内存的数据类型是“uint8_t”,我使用“uint32_t”类型作为大小。例如,

ptr = new uint8_t[size];

其中 ptr 是 uint8_t 类型,size 是 uint32_t 类型。

现在,我们的代码中出现了指向这种类型分配的内存崩溃,并且抛出的错误消息是:

“_int_malloc: 断言 (unsigned long)(size) >= (unsigned long)(nb) 失败。”

我们的一位团队成员认为 ptr 和大小不匹配是导致崩溃的原因,我不同意他的看法。

请解释这是否是导致崩溃的原因,如果是,如何解释?

另外,请解释我们收到上述错误消息的情况。

【问题讨论】:

@CoryKramer 为什么不允许这样做?如果我需要 1024 个字符长的文本作为数组怎么办?数组大小的类型与数组所包含的数据类型之间的不匹配导致错误听起来很荒谬。 - 除非我误解了提问者或您的评论。 Shivakumar - 尺寸有多大?你确定不使用ptr就释放它吗? @Rochet2 我想我误解了他们的问题。我虽然ptruint32_t* 类型,但他们正在分配new uint8_t[] @Rochet2 我们将连续写入大小为 1476 的数据,是的,一旦我们不使用它,我们就会释放它。不是每次都发现这个问题,但到目前为止,我们测试了 100 次中有 2 次。 【参考方案1】:

size 的类型并不重要:无论它是什么类型,它本质上都是作为参数传递给采用size_t 的函数。

uint32_t size = 10;
uint8_t *ptr = new uint8_t[size];

这是完全有效的代码,无需协调 ptrsize 的类型。


您在此行遇到的错误表明内存分配库中存在内部错误。当您的程序在其他地方做了一些非法的事情从而破坏了程序的状态时,这似乎是由合法代码引起的。

您可以通过使用其他一些分析工具(例如 valgrind、ubsan 或静态分析器)找到最初的原因。

【讨论】:

以上是关于使用新的内存分配失败的主要内容,如果未能解决你的问题,请参考以下文章

wasm 代码提交分配失败 - 进程内存不足

JVM并发分配内存解决方案

Linux 内存池源码浅析

Linux 内存池源码浅析

malloc函数分配内存失败的常见原因

处理失败的内存分配