C/C++支持通过指针这一工具来最大程度上提供编程的灵活性,这也是C++备受争议的一个问题。指针固然很方便,但是错误使用所带来的后果是不堪设想的。我们初学代码时应该都有过突然输出的数据和自己所设想的完全不一致并且数据很莫名其妙的时候,这就说明内存处理出现了问题。
内存错误一般分为以下4种:
1.内存泄漏
内存泄漏就是你分配了一块内存空间后,却没有释放,从而导致它一直在随着程序一起运行。有的时候,你意识到要释放内存,但是可能程序会在break或是return处返回,没有执行到释放语句,仍然会导致内存的泄漏。 注意:结构体需要释放其所有的域,否则还是会造成内存泄漏。
2.重复释放
内存只能被释放一次,当其释放后这块内存可能会被系统分配给其他程序使用。当你重复释放该内存时,可能会引起很多不必要的麻烦。对于多个指针指向同一块内存的情况,只需要释放任意一个指针即可.
3.坏指针问题
数据没有被很好的初始化,而栈可能包含一些没有被丢弃的数据,于是在机缘巧合之下,指针可能带有它们的值。C++可以通过初始化函数来帮助避免这些问题。如果你不知道正确的初始值,可以考虑将指针赋值为null。
4.超量写内存
第一个常见原因为数组越界。如果指针修改了数组范围外的值,则可能导致程序的崩溃。 第二个常见原因为分配空间不足。很多c语言的字符串操作并不对空间做检查,比如strcpy函数和strcat函数,如果给的空间不够,会接着向后写入,从而修改了未知的数据。 当然,操作符的优先权也会导致超量写内存,比如++或–等等。