C 如果我们释放已释放或未释放的内存,会发生什么?
当我释放未使用C 如果我们释放已释放或未释放的内存,会发生什么?,c,C,当我释放未使用malloc分配的malloced内存时,valgraind工具会给出如下错误: Invalid free() / delete / delete[] 嵌入式C编程有危险吗? 在代码中,每当malloc失败时,我无法判断我必须释放哪个malloced指针。如果对未分配malloc的内存调用free,calloc或realloc,或者对已释放的内存调用它,你将得到未定义的行为 是的,这对嵌入式编程是危险的。几乎总是会使您的软件崩溃。这将导致未定义的行为,很可能是堆损坏和/或程序崩溃
malloc
分配的malloc
ed内存时,valgraind工具会给出如下错误:
Invalid free() / delete / delete[]
嵌入式C编程有危险吗?
在代码中,每当
malloc
失败时,我无法判断我必须释放哪个malloc
ed指针。如果对未分配malloc
的内存调用free
,calloc
或realloc
,或者对已释放的内存调用它,你将得到未定义的行为 是的,这对嵌入式编程是危险的。几乎总是会使您的软件崩溃。这将导致未定义的行为,很可能是堆损坏和/或程序崩溃。这在任何类型的系统中都是危险的。您的程序可能会崩溃(正如每个人都回答的那样),更糟糕的是,它可能会比您错误地调用malloc时更晚崩溃。所以很难找到这些bug
一个可能的解决方案是,假设您可以访问所有源代码并可以对其进行更改(即假设您不使用无法更改的第三方库),可以通过替换
malloc
,calloc
等。。。使用GC\u MALLOC
或GC\u CALLOC
在使用\include
d
后(这样,您就不用再费心拨打免费电话了)
Boehm的垃圾收集器是保守的,它泄漏的概率很小(因为它将调用堆栈上的每个字都作为可能的指针处理,即使该字实际上没有可引用的指针,但例如整数或浮点)
你没有解释嵌入式C编程对你意味着什么。在某些行业和环境中,甚至不允许关键的嵌入式C代码(比如让飞机飞行的代码)调用malloc
或使用动态分配的堆数据 您将获得未定义的行为,通常是释放尚未分配的内存而导致内存损坏
我不明白你怎么能说你不知道malloc操作的哪个指针结果失败了
这真的很简单
声明指针并将其设置为null
使用malloc分配内存。仅在已经为空的指针上使用malloc(以防止由于将指向内存块的指针重新分配给另一个内存块而导致内存泄漏)。如果malloc失败,指针将保持空
在释放malloc操作分配的内存时,仅当指针不为null时才执行free操作,一旦释放,就将指针设置为null 这在任何类型的C编程中都是危险的。“未使用malloc
分配的malloc
内存?”?那没有道理。要么是malloced,要么不是。为什么只进行嵌入式编程?因为OP专门询问嵌入式编程。。。你们应该问山姆这个问题,而不是谢尔盖:)因为问题就是关于那个。顺便说一句,我认为这个问题应该以重复的形式结束。例如,关于stackoverflow这个主题的很多问答。@MahmoudAl Qudsi:这是一个标准的保证UB,因此,仅将其限制为嵌入式编程是错误的。如果您觉得这个Q应该作为重复项关闭,那么您应该将其标记为重复项并投票关闭它,而不是回答它。@Als我没有特权标记它或投票关闭它,所以我相信您会在这里得到正确的决定。UB意味着没有人知道会发生什么。但我相信大家都知道在这种情况下接下来会发生什么。+1强调了在“随机”时间、“随机”位置,在不同的线程和您已经测试并证明正常的代码中,间歇性故障的副作用噩梦。