【高质量C++/C总结7】内存管理——常见的内存错误及对策

说在开始:

我提炼了《C++ Primer》、《侯捷C++》、《高质量程序设计指南——C/C++语言》等资料中的重要部分,并总结成此博文。其中涉及到许多我个人对C++的理解,如若有不合理之处,还请朋友们多多指出,我会虚心接受每一个建议。

作者:尹豆(憨豆酒),联系我yindou97@163.com,熟悉图形学,图像处理领域,本章代码: https://github.com/douysu/computer-graphics-notes

常见内存错误和对策

此部分主要参考的林锐的C++程序设计,其中加入了我个人的理解。

我自己在写程序过程中也经常遇到内存错误,深有体会,这些错误在程序中不容易发现,在不同的平台上产生的结果也是不同的,这里就对常见的内存错误进行总结。

(1)内存有可能会分配不成功

在动态申请内存时,有可能会申请失败。解决办法:在使用内存之前,检查指针是否为NULL。如以下代码:

assert(p!=NULL)
//或者
if(p==NULL)
//或者
if(p!=NULL)

(2)内存分配虽然成功,但是尚未初始化就使用它。此句话可能比较不好理解,看以下的代码:

int main()
{
	int *p = new int[2];
	cout << p[0] << endl;//垃圾值
	p[0] = 2;
	cout << p[0] << endl;//2
	delete [] p;
}

p指向的内存分配成功,但是没有初始化值,打印后是垃圾值,初始化才可以使用。造成这个现象的原因有两个:(1)没有初始化的意识,在C++中初始化、定义是严格区分的。(2)误认为分配得到的内存中的值为0。

C++对动态内存的初值究竟是什么没有做出统一的规定,尽管有些时候会自动初始化为0,但是我们应该潜意识的设置其初值。这是一个很好的编程习惯,无论是用什么方式创建数组,都别忘了给定初值。即便是NULL或者0,千万别因小失大。指针定义的时候就给定NULL是最好的选择。

(3)内存分配成功而且已经初始化,但是超过了使用界限

内存使用越界很容易出现错误,例如数组下标越界等等。好的编译器会帮你检查,但是还是需要自己注意。

(4)忘记释放内存,或者只释放了部分内存造成内存泄漏

在使用new/malloc申请内存后千万记得使用户delete/free进行内存的释放,对内存数组释放时记得使用delete [] p。如果忘记释放内存,那么程序占用内存会越来越多,直到内存耗尽。

(5)释放内存后还在继续使用

a.程序中对象关系比较复杂时,那就说明代码的结构有问题,需要重新梳理,改变混乱的局面。

b.不要return栈内存的指针或者引用,该内存在函数结束时自动释放,毫无意义,如下段代码

Object& function()
{
    Object ob;
    return ob;
}

c.free或者delete内存后,没有将内存指针设置为NULL,形成野指针。

d.多次释放同一块内存。

实际开发中需要注意的内存问题

以下是我开发过程中遇到的问题。

(1)在释放内存后,一定要将指针设置为NULL,否则他人使用时容易出现错误。

(2)在循环语句中,注意内存申请和释放问题。

(3)函数参数是指针时,函数会对形参指针进行拷贝,返回指针指向的内存时应当注意。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值