您的位置:首页 > 编程语言 > C语言/C++

避免内存泄漏 - C++快速入门38

2012-08-05 05:07 267 查看

避免内存泄漏

让编程改变世界

Change the world by program

避免内存泄漏

这个话题就像古时候女人的裹脚布,又长又臭哈~

前面我们讲过,分配了一个内存块但忘记了释放它,这是一种严重的错误。这样的内存块将等到程序执行结束时才会被释放掉。

如果程序会运行很长时间(例如在服务器上,注意不是所有的操作系统都想windows一样每天都要重启哈)并且在不停地申请新内存块,忘记释放那些已经不再有用的老内存块将迟早会把内存消耗殆尽,直接导致后边的new操作无法执行甚至是崩溃!

这样的编程漏洞我们称之为内存泄漏(memory leak),因为它会像水池里的漏洞那样把内存池里的可用内存慢慢地消耗殆尽。

new语句所返回的地址是访问这个内存块的唯一线索,同时也是delete语句用来把这个内存块归还给内存池的唯一线索。

我们一起来看下面这个栗子:

[codesyntax lang="c"]
new *x;

x = new int[1000];
delete[] x;
x = NULL;

[/codesyntax]

这意味着如果这个地址值(保存在x里)丢失了,就会发生内存泄漏问题。

地址值会因为很多原因而丢失哦,比如因为一个指针变量被无意中改写,例如:

[codesyntax lang="c"]
int *x;

x = new int[3000];
x = new int[4000];

delete[] x;
x = NULL;

[/codesyntax]

大家看出来了吗?这是会导致内存泄漏的情况之一。

会导致内存泄漏的另一种情况是用来保存内存块地址的指针变量作用域问题,例如:

[codesyntax lang="c"]
void foo()
{
My Class *x;
x = new MyClass();
}

[/codesyntax]

当foo()函数结束时,指针变量x将超出它的作用域,这意味着它将不复存在,它的值当然就会丢失。

有两种方法可以用来堵住这样的漏洞:

第一个方法是在return语句之前的某个地方插入一条delete x语句:

[codesyntax lang="c"]
void foo()
{
MyClass *x;
x = new MyClass();
delete x;
x = NULL;

return;
}

[/codesyntax]

第二个方法是让函数把内存块的地址返回给它的调用者:

[codesyntax lang="c"]
MyClass *foo()
{
MyClass *x;
x = new MyClass();

return x;
}

[/codesyntax]

内存作用域

变量都有一个作用域:规定了它们可以在程序的哪些部分使用。

这个作用域通常就是对它们做出声明和定义的函数的函数体,如main函数或某个子函数。

如果被定义在任何一个函数的外部,变量将拥有全局作用域,这意味着它们可以在整个程序中的所有函数里使用。

不过,应该尽量避免使用全局变量,因为它们往往会让代码变得难以调试和容易出错!

动态内存不存在作用域的问题,一旦被分配,内存块就可以在程序的任何地方使用。

因为动态内存没有作用域,所以必须由程序员来跟踪它们的使用情况,并在不再需要用到它们的时候把它们及时归还给系统。

这里需要特别注意的是,虽然动态分配的内存块没有作用域,但用来保存其地址的指针变量是受作用域影响的。

与鱼油分享

专注那些我们应该去做的事情,并坚持下去!

一片飘落的树叶最终落在哪里,决定他的是上帝。至于我们,正如那片树叶一般,去努力想着我们的目标飞行就足够了。。。。。。

至于上帝的眷顾嘛?大家要知道,机会总是留给有准备的人。只有你朝着梦想去努力追求,才有可能实现梦想,而在困难与挫折面前停滞不前,忧虑苦闷肯定不属于追求梦想的范畴!

[buy] 获得所有教学视频、课件、源代码等资源打包 [/buy]
[Downlink href='http://urlxf.qq.com/?RJbm2aa']视频下载[/Downlink]
[Downlink href='http://kuai.xunlei.com/d/LUVEOOLZGBVF']备胎下载[/Downlink]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: