浅谈C++中的那些内存泄露
来源:互联网 发布:软件产业基地5栋 编辑:程序博客网 时间:2024/06/06 01:23
虽然学过C语言,但是C++里面的一些基础还是不太懂,还需要再掌握。老范也开始要讲C++设计模式了,必须快点看了,不然就要白花窝滴钱了。
对于内存泄露,我的个人理解就是程序在运行过程中,自己开辟了空间,用完这块空间后却没有释放。今晚上我就犯了这样的低级错误,导致程序没有运行出来,还是先看代码:
#include <iostream>/* run this program using the console pauser or add your own getch, system("pause") or input loop */using namespace std;class person{public:person(){cout<<"基类构造函数执行中.....\n";} ~person(){cout<<"基类析构函数执行中.....\n";}}; class DS:public person{public:DS(){cout<<"派生类构造函数执行中.....\n";}~DS(){cout<<"派生类析构函数执行中.....\n";}};int main(int argc, char** argv) {DS p;return 0;}
这段代码是没有问题的,程序开始从main函数运行,实例化派生类DS一个对象p,不管如何,派生类DS总先调用基类person的构造函数,然后派生类DS在调用自己的构造函数,接着是自己的析构函数,最后是基类person的构造函数,运行结果如下图所示:
其实嘛,这个什么时候调基类构造(析构),什么时候调派生类构造(析构),我个人的理解可以用简单的图来表示了,基类构造和析构就像一个大框架包含着派生类的构造和析构:
1. 对于上述的程序我在main函数中继续修改,如果new了,却没delete,(用匹配和兼容随意,结果还是一样的)
int main(int argc, char** argv) {DS *p=new DS();
// person *p= new DS();
return 0;}
这时候就出现问题了,如果在C++中,就会出现下面的结果:
原因是new了,却不没delete,造成内存泄露,在程序运行过程中析构函数是不会调用的,直到整个程序结束,系统才会自动释放内存。
2. 对于上述的程序我在main函数中继续修改,这次加上delete p,现在匹配的情况下操作,也就是派生类的指针指向派生对象:
int main(int argc, char** argv) {DS *p=new DS(); delete p;return 0;}
运行结果大家也应该猜的出来,4个全有
3. 对于上述的程序我在main函数中继续修改,这次利用兼容,即就是基类指针指向派生类的对象:
<strong>int main(int argc, char** argv) { person *p=new DS(); delete p;return 0;}</strong>
但是这次又出现问题了,运行结果中没有派生类的析构函数,这都是兼容惹的祸,因为基类指针只能指向派生类继承自己的那一部分,对于派生类DS那一部分,基类指针映射不到,所以就不去调用它,演示结果如下:
要解决这问题实际不难,这个时候就要,基类指针就基类指针,管他三七二十一的,我这个时候只要在基类person的析构函数中加一个virtual(虚特性),虽然在main函数中,还是第三中情况。我也可以轻轻松松的输出下面的结果:
其实这个里面涉及到了,继承(兼容规则),多态的知识,在C++涉及模式中,95%都用到了多态性,无疑这是C++的重点,一定要好好学习这一块。
对于继承和多态的相关知识下一个博客在说吧,那个就要大写特写了,,哈哈,那是一个很有意思的举例——媳妇炒菜,工厂模式,慢慢的就进入C++的核心中去了。。
接下来,关于C++中,指针delete删除值得问题,这一块有必要说一下:
先把代码发上去在说吧
#include <iostream>/* run this program using the console pauser or add your own getch, system("pause") or input loop */using namespace std;int main(int argc, char** argv) {int *p;p=new int;*p=3; cout<<"输出值*p= "<<*p<<endl; cout<<"输出地址p= "<<p<<endl; delete p; //delete p 之后 cout<<"delete p 之后输出值*p= "<<*p<<endl; cout<<"delete p 之后输出地址p= "<<p<<endl; return 0;}
我定义了一个整型指针p,new了一块int型的整型单元,并给*p赋值3,之后呢,输出*p和p的地址,之后我在delete p。其实我们每次delete实际上是删除的是p指向那块空间的值,并没有删除它的地址,因此才会出现下面的结果演示:
好了,我的能力有限就只能写到这里了,以后遇到问题在完善,不对的地方也要修改,,睡觉了,,,瞌睡死了,,,,
- 浅谈C++中的那些内存泄露
- c++中的内存泄露浅谈(一)
- 浅谈Java编程中的内存泄露问题
- 浅谈C/C++内存泄露及其检测工具
- 浅谈C/C++内存泄露及其检测工具
- 浅谈C/C++内存泄露及其检测工具
- 浅谈C/C++内存泄露及其检测工具
- 浅谈C/C++内存泄露及其检测工具
- 浅谈C/C++内存泄露及其检测工具
- 浅谈C/C++内存泄露及其检测工具
- 浅谈C/C++内存泄露及其检测工具
- 浅谈C/C++内存泄露及其检测工具
- 浅谈C/C++内存泄露及其检测工具
- 浅谈C/C++内存泄露及其检测工具
- 浅谈检测内存泄露
- 浅谈Java内存泄露
- 浅谈java内存泄露
- 浅谈C中的内存对齐
- openfire+smack实现聊天室功能MultiUserChat.isServiceEnabled问题
- JQuery学习(4-1)
- linux用户管理
- 3年javaee经验程序猿转hadoop还是android好?
- struct,typedef,volatile,const,static
- 浅谈C++中的那些内存泄露
- android设置titlebar--带button。
- JAVA程序设计(14.1)----- 图书馆管理系统 初步设计 内部功能篇
- wamp上能够访问jsp(未解决 游客勿看)
- wikioi 1083 Cantor表
- java 同步阻塞io和异步非阻塞io
- Https VS Http 性能比拼
- DLL动态链接库的工作原理
- 【数据结构】栈-数组的实现