当我释放未使用malloc
而未使用valgraind工具分配的malloc
内存时,给出了如下错误:
Invalid free() / delete / delete[]
嵌入式C编程是否危险?
在malloc
失败的代码中,我无法判断我必须释放哪个malloc
指针。
答案 0 :(得分:4)
这将导致未定义的行为,很可能是堆损坏和/或崩溃程序。它在任何一种系统中都很危险。
答案 1 :(得分:2)
您的程序可能会崩溃(正如所有人都回复的那样),更糟糕的是,与错误调用malloc
时相比,它可能会崩溃。所以找到这些错误很难。
一种可能的解决方案,假设您可以访问所有源代码并且可以更改它(即假设您不使用您无法更改的第三方库)可能是使用Boehm conservative garbage collector,通过替换每个发生
在malloc
d calloc
之后GC_MALLOC
,GC_CALLOC
等... #include
或<gc/gc.h>
(然后,您将不会打电话free
了。
Boehm的垃圾收集器是保守的,它泄漏的可能性很小(因为它将调用堆栈中的每个字都作为一个可能的指针处理,即使该字实际上不带有可解除引用的指针,但是例如一个整数或浮动)。
您没有解释嵌入式C编程对您来说意味着什么。在某些行业和环境中,关键的嵌入式C代码(如使您的飞机飞行的代码)甚至不允许调用malloc
或使用动态分配的堆数据。
答案 2 :(得分:1)
如果您在未分配free
,malloc
或calloc
的内存上调用realloc
,或者如果您在已经释放的内存上调用它,会得到未定义的行为。
答案 3 :(得分:0)
是的,嵌入式编程很危险。它几乎总是让你的软件崩溃。
答案 4 :(得分:0)
通过释放尚未分配的内存,您将获得未定义的行为,通常是内存损坏。
我不知道你怎么能说你不知道malloc操作的哪个指针结果失败了?
这真的很简单。
声明你的指针并将它们设置为null。
使用malloc分配内存。仅对已经为空的指针使用malloc(以防止由于将指向内存块的指针重新分配给另一个内存而导致的内存泄漏)。如果malloc失败,那么指针将保持为空。
当释放由malloc操作分配的内存时,如果指针不为null,则仅执行自由操作,一旦释放,则将指针设置为null。