我使用operator new分配了内存。需要分配内存的数据类型是'uint8_t',我使用'uint32_t'类型作为大小。例如,
ptr = new uint8_t[size];
其中ptr的类型为uint8_t,size的类型为uint32_t。
现在,我们遇到内存崩溃,指向我们的代码中的这种类型的分配,并抛出错误消息:
“_ int_malloc:断言(无符号长)(大小)> =(无符号长)(nb)失败。”
我们的一名团队成员表示,ptr和大小的不匹配是导致崩溃的原因,我不同意他的看法。
请解释这是否可能是导致坠机的原因,若然,怎么办?
此外,请解释我们收到上述错误消息的情况。
答案 0 :(得分:3)
size
的类型并不重要:无论它是什么类型,它基本上都作为参数传递给一个带size_t
的函数。
uint32_t size = 10;
uint8_t *ptr = new uint8_t[size];
这是完全有效的代码,不需要协调ptr
和size
的类型。
您在此行遇到的错误表示内存分配库中存在内部错误。当你的程序在其他地方做过非法破坏程序状态时,它似乎是由合法代码引起的。
您可以通过使用其他分析工具(如valgrind,ubsan或静态分析器)找到最初的原因。