c++避免内存泄漏
2016-04-18 22:09
316 查看
在c/c++语言对于程序内存的管理不像java语言一样有自己的垃圾回收机制,而c/c++却要程序员手动的释放用关键字new或者 malloc系统函数申请的内存空间,然而由于程序员的疏忽可能会忘记去手动释放内存,这样就导致了程序内存的泄漏。
在c/c++的程序内存分配中,自顶向下分为代码段,数据段,栈区,栈保留区,动态链接库区,堆保留区,堆区。
程序栈内存有系统管理,栈上的数据生命周期结束时系统会自动回收栈上的内存,而堆上的内存有程序员自己分配,堆上数据的生命周期结束时系统不会自动回收它的内存,而是需要程序员手动释放,这样就很容易造成内存泄漏。
介于堆与栈的区别,想要避免内存泄漏就需要用到它们的特性,当然还有关于c++析构函数的特性,在c++中,当class对象的生命周期结束时,class对象会自动调用自己的析构函数来释放类咱实例化时构造函数所申请的内存空间。
因此,如何来避免由于程序员的疏忽而导致内存泄漏就相对比较明了了,那就是将动态内存的申请放在类的构造函数中,然后在类的析构函数中手动释放构造函数申请的内存空间,最后将class对象定义在程序栈上。这样在class对象生命周期结束时,系统会自动回收栈上class对象所占的内存,同时class对象在它的生命周期结束时将会自动调用自己的析构函数来释放构造函数申请的堆内存空间,这样留可以间接地使用程序栈来管理自动分配的内存,也就间接地避免了程序运行过程中内存的泄漏。
以上只是个人的一点愚见,有什么不对的地方还请大神帮忙指出。
在c/c++的程序内存分配中,自顶向下分为代码段,数据段,栈区,栈保留区,动态链接库区,堆保留区,堆区。
程序栈内存有系统管理,栈上的数据生命周期结束时系统会自动回收栈上的内存,而堆上的内存有程序员自己分配,堆上数据的生命周期结束时系统不会自动回收它的内存,而是需要程序员手动释放,这样就很容易造成内存泄漏。
介于堆与栈的区别,想要避免内存泄漏就需要用到它们的特性,当然还有关于c++析构函数的特性,在c++中,当class对象的生命周期结束时,class对象会自动调用自己的析构函数来释放类咱实例化时构造函数所申请的内存空间。
因此,如何来避免由于程序员的疏忽而导致内存泄漏就相对比较明了了,那就是将动态内存的申请放在类的构造函数中,然后在类的析构函数中手动释放构造函数申请的内存空间,最后将class对象定义在程序栈上。这样在class对象生命周期结束时,系统会自动回收栈上class对象所占的内存,同时class对象在它的生命周期结束时将会自动调用自己的析构函数来释放构造函数申请的堆内存空间,这样留可以间接地使用程序栈来管理自动分配的内存,也就间接地避免了程序运行过程中内存的泄漏。
以上只是个人的一点愚见,有什么不对的地方还请大神帮忙指出。
相关文章推荐
- C++问题小结--3.构造函数与析构函数关于其自身特点的简单代码陈述
- c++继承属性不具有多态性
- 计算某个日期起N天后的日期(C语言递归实现)
- 【C++专题】static_cast, dynamic_cast, const_cast探讨
- C语言中的全局变量定义与使用
- Ubuntu下编写C语言程序
- PAT (Basic Level) Practise (中文)1028. 人口普查(20)
- protobuf的编译与安装(教程)附带资源(亲测,Mac下可以用)
- 稀疏矩阵-压缩存储-列转置法- 一次定位快速转置法
- 单链表的头插、中插、尾插、删除、逆序、显示(C语言实现)
- 康托展开
- string类的实现(mystring)
- 巩固C语言(十)----指针数组 & 函数指针和指针函数
- C/C++常考面试题(1)
- HDU 5665 lucky
- 华为机试练习ex013_cpp之操作系统任务调度问题
- C++语法细节笔记
- c++ 实现atoi()函数
- C语言编辑器获取数组中元素个数
- 对称矩阵 压缩存储