前言
没有 Java 中垃圾回收机制,也没有 Rust 中的编译期类型检查机制,C/C++ 要求开发人员自己管理内存(合理申请内存,并及时归还),确保内存安全是应用程序开发者的责任。
毕竟好的厨子不应该将厨房弄得一团糟;-)
C/C++ 程序中各种因内存产生的错误大致有以下几种情况,这些错误一般出现在程序运行期间,有些错误一旦出现,往往是“致命”的。
以下示例使用 C 语言风格,其中大部分实例将 malloc/realloc
替换成 new
, free
替换成 delete
可以阐释 C++ 中类似的操作效果。
Bad Free (BAF)
操作:企图释放没有申请的内存,即非堆区内存(non-heap block)。
常见原因:free()/realloc()
函数中传入指向栈区的指针。
后果:程序异常终止。
例如:
{
char foo[4];
char* bar = &foo[0];
/* bad free */
free(bar