码迷,mamicode.com
首页 > 编程语言 > 详细

C++内存管理

时间:2017-11-02 00:05:45      阅读:213      评论:0      收藏:0      [点我收藏+]

标签:原来   标准   for   存储   程序崩溃   技巧   封装   空间   情况   

内存管理是软件运行时分配和使用计算机内存资源的技术的总称。内存管理在C++中无处不在,其目标是尽可能高效快速的分配内存资源,并在适当的时候将已分配的资源释放收回,因此内存管理对于编写出高效率的程序是非常重要的。

在C++中,供用户使用的内存空间分为堆、栈和全局/静态存储区。全局变量和静态局部变量存放在静态存储区中,全局变量在程序开始时分配存储单元,静态局部变量在调用定义它的函数时分配存储单元,全局变量和静态局部变量的存储空间都在程序结束时释放。栈中一般存放的是局部变量,函数的形式参数,以及函数调用时的现场保护和返回地址等,会随着所在函数的结束而自动释放。堆中的存储单元一般都是应用程序使用malloc0函数和new动态申请分配的,编译器不会自动释放回收堆中分配的存储空间,需要要应用程序使用相应的free0函数和delete释放。如果一直不释放堆内已经使用完毕的空间,在程序的运行过程中指向该空间的指针指向了别的空间,则该空间就无法释放直到程序结束后操作系统自动回收,造成内存的泄露和浪费。栈和全局门挣态存储区是由编译器自动管理的,无需手工控制,但是对于堆来讲,所有堆对象的创建和销毁都是由程序员完成的,如果处理不好,就会发生内存泄露和浪费等问题。因此,我们讨论的内存管理的对象实际上就是堆空间的管理。编译器往往不能自动发现内存错误,通常在程序运行过程中这些错误才会暴露出来。常用的预防内存错误的编程技巧如下:

1)在内存使用之前检查指向该内存的指针是否为空(NULL),如果为NULL则内存申请失败,

应进行防错处理。

2)内存申请成功后,对该内存初始化,因为内存的缺省初始值并没有标准,一旦将未初始化的内存作为右值使用,可能会得到完全出乎意料的结果。

3)防止数组或者指针内存越界,在使用数组或指针时经常发生数组下标或指针时多加了一,尤其是在for循环中,循环次数控制错误,经常会导致数组或指针内存越界。

4)内存使用结束后一定要释放,否则每调用一次含有这种错误的函数就多消耗一块内存,最终内存耗尽,程序崩溃。所以动态内存的申请与释放操作必须成对出现,malloc、alloc和calloc对应free,new对应delete。

5)杜绝悬挂指针,悬挂指针并不是NULL指针。内存被释放后,原来指向该内存的指针没有

置为NULL,那么该指针就成为了一个悬挂指针。悬挂指针的存在非常危险,因为if语句并不能判断出一个指针是不是悬挂指针。悬挂指针的产生通常有三种情况:指针变量未初始化,其缺省值随机,指向非法内存;返回指针的函数错误的返回指向栈内存的指针,因为该内存在函数结束时会被自动销毁;指针被free或delete后,没有置为NULL值并被误认为是合法指针。

C++中,内存的分配和回收与对象的构造和析构联系紧密,使用new创建一个新的对象时,分配内存并在该内存中构造一个对象,使用delete销毁对象时,调用析构函数撤销对象并将对象所占用的内存返回给系统。因此,只要用户自定义的类能够遵循在构造函数中分配所有资源在析构函数中回收所有资源的原则将所有资源封装,就可以保证类的动态建立不会引起任何资源泄露。

C++内存管理

标签:原来   标准   for   存储   程序崩溃   技巧   封装   空间   情况   

原文地址:http://www.cnblogs.com/johnll/p/7768901.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!