`
yexin218
  • 浏览: 958153 次
  • 性别: Icon_minigender_1
  • 来自: 珠海
社区版块
存档分类
最新评论

C++内存泄漏笔记

阅读更多

内存泄漏的一个重要的原因是你忘记了在你的class或者function中使用了delete操作符。

class.h

#ifndef _CLASSH_H
#define _CLASSH_H
#include <iostream>
using namespace std;

class Buddy{
public:
	Buddy(){
       a = 0;
	}
	~Buddy(){
      cout<<"Buddy is destroyed.."<<endl;
	}
	void setA(int newa){
       a = newa;
	}
	int getA(){
     return a;
	}
private:
	int a;
};

class Brother{
public:
	Brother(){
       buddy = new Buddy();  
	}
	~Brother(){
		if(buddy){
          delete buddy;
		  buddy = NULL;
		  cout<<"Brogher---buddy destroyed"<<endl;
		}

	}
	void setBuddy(Buddy *newBuddy){
      buddy = newBuddy;
	}
	Buddy *getBuddy(){
       return buddy;
	}
private:
	Buddy *buddy;

};
#endif

 

test.h

#include "classh.h"
#include <iostream>
using namespace std;

Buddy *testReturnPointer(int num){
      Buddy *result = new Buddy();
	  result->setA(num);
	  return result;
}

Brother *testPointerInsideClass(int num){

      Brother *bro = new Brother();
	  Buddy *b = new Buddy();
	  b->setA(num);
	  bro->setBuddy(b);
	  return bro;

}

Buddy &getReference(int num){

  static Buddy bud;
  bud.setA(num);
  return bud;
}

 

test.cpp

#include "test.h"
#include <iostream>
using namespace std;
int main(){

	Buddy *buddy = testReturnPointer(90);//-----------------1
	Brother *bro = testPointerInsideClass(45);//-------------2
	Buddy bud =getReference(44);
	cout<< bud.getA()<<endl;
	Buddy bud1 =getReference(464);
	cout<< bud1.getA()<<endl;
	delete buddy;//-------------------------------------------------1'
	delete bro;//-----------------------------------------------------2'
return 0;
}

 如果你是在其他函数中返回指针,如testReturnPointer()-----1;然后在其他函数或者main里面调用。如果你忘记了写与1对应的delete buddy----------1'那么buddy对应的内存空间就不会被释放。同样testPointerInsideClass()----2也返回的是一个Brogher的指针,而Brother这个类又包含了Buddy的指针变量。这个时候也需要注意在Brother析构函数中把已经分配给Buddy指针变量的空间给收回。即:

~Brother(){
          if(buddy){
             delete buddy;
             buddy = NULL;
             cout<<"Brogher---buddy destroyed"<<endl;
		}

	}

 由于C++没有Java那样的垃圾回收机制。你必须这样手动释放掉你在程序中new出来的空间。如果对指针不熟悉,或者经常忘记,一个简单的方法可以把指针或者变量设置成static,由于这样整个程序只有一份地址空间,而且其对象在程序结束时自动调用了析构函数,所以不会有泄漏的问题,如:

Buddy &getReference(int num){

  static Buddy bud;
  bud.setA(num);
  return bud;
}

 

更多的关于内存泄漏和解决方法,请参考:http://www.codersource.net/c++_memory_leaks.aspx

分享到:
评论
2 楼 night_stalker 2009-04-18  
更好的方法是使用 auto_ptr 和 shared_ptr
1 楼 crackcell 2009-04-18  
记得大二时上系统程序设计也玩过这些东西。

相关推荐

    JAVA--达内培训笔记

    (4)垃圾回收机制 --- 自动垃圾收集,永远不会出现内存泄露的问题 4、虚拟机 java语言是先编译后解释,java源码是通过编译生成一种特殊的.class的中间字节码文件,然后再由JVM进行解释运行。 (编译) (解释...

    史上最强的C语言资料

    1. C 语言中的指针和内存泄漏 5 2. C语言难点分析整理 10 3. C语言难点 18 4. C/C++实现冒泡排序算法 32 5. C++中指针和引用的区别 35 6. const char*, char const*, char*const的区别 36 7. C中可变参数函数实现 38...

    [java]读书笔记整理:一切都是对象

    一.用引用操纵对象 每种编程语言都有自己的数据操纵方式。有时候,程序员必须注意将要处理的数据是什么类型。...这样做就消除了这类编程问题(即“内存泄漏”),这是由于程序员忘记是放内存而产生的问题。

    高级进阶c语言教程..doc

    1. C 语言中的指针和内存泄漏 5 2. C语言难点分析整理 10 3. C语言难点 18 4. C/C++实现冒泡排序算法 32 5. C++中指针和引用的区别 35 6. const char*, char const*, char*const的区别 36 7. C中可变参数函数实现 38...

    c++11智能指针解析——揭开底层面纱,完整理解智能指针.pdf

    简断截说:c++的⼊门坑点⼤家都是有⽬共睹的,⽆⾮就是指针的理解不深导致⼀些野指针,内存泄露等问题,所以就不赘述。智能指针正 好能够弥补这些问题,因为它本质是存放在栈的模板对象,只是在栈内部包了⼀层指针...

    免费下载:C语言难点分析整理.doc

    1. C 语言中的指针和内存泄漏 5 2. C语言难点分析整理 10 3. C语言难点 18 4. C/C++实现冒泡排序算法 32 5. C++中指针和引用的区别 35 6. const char*, char const*, char*const的区别 36 7. C中可变参数函数实现 38...

    java基础学习笔记 java整合技术 java工具类.rar

    java较为简单,例如:java不再支持多继承,C++是支持多继承的,多继承比较复杂,C++中有指针,java中屏蔽了指针的概念,避免了绝大部分的指针越界和内存泄露的问题,这里说明一下,java语言低层是用C++实现的,并不...

    C语言难点分析整理.doc

    1. C 语言中的指针和内存泄漏 5 2. C语言难点分析整理 10 3. C语言难点 18 4. C/C++实现冒泡排序算法 32 5. C++中指针和引用的区别 35 6. const char*, char const*, char*const的区别 36 7. C中可变参数函数...

    c语言难点分析整理,C语言

    1. C 语言中的指针和内存泄漏 5 2. C语言难点分析整理 10 3. C语言难点 18 4. C/C++实现冒泡排序算法 32 5. C++中指针和引用的区别 35 6. const char*, char const*, char*const的区别 36 7. C中可变参数函数实现 38...

    高级C语言 C 语言编程要点

    1. C 语言中的指针和内存泄漏 5 2. C语言难点分析整理 10 3. C语言难点 18 4. C/C++实现冒泡排序算法 32 5. C++中指针和引用的区别 35 6. const char*, char const*, char*const的区别 36 7. C中可变参数函数实现 38...

    高级C语言详解

    1. C 语言中的指针和内存泄漏 5 2. C语言难点分析整理 10 3. C语言难点 18 4. C/C++实现冒泡排序算法 32 5. C++中指针和引用的区别 35 6. const char*, char const*, char*const的区别 36 7. C中可变参数函数实现 38...

    C语言难点分析整理

    1. C 语言中的指针和内存泄漏 5 2. C语言难点分析整理 10 3. C语言难点 18 4. C/C++实现冒泡排序算法 32 5. C++中指针和引用的区别 35 6. const char*, char const*, char*const的区别 36 7. C中可变参数函数实现 38...

    Qt for Android 正记时软件极简版

    代码比较冗余同时可能存在内存泄漏,仅供参考 另外附带了简易记事本功能(是为了验证QtforAndroid是否和电脑端保存文件的方式是否支持,得到的结论是使用电脑端形如:"D:\\A\a.txt"的存储方式,但是在手机端没有找到...

    Vulnerability_Scanner:利用机器学习技术的C ++漏洞扫描程序

    这些漏洞可能构成严重的利用风险,并导致系统受损,信息泄漏甚至进一步的财务损失。 不幸的是,测试和手动代码审查不能总是找到每个漏洞。 为了解决该问题,我们正在使用一种高效的机器学习驱动方法来解决这一日益...

    pipe_line:用于创建和运行管道的WIP库

    如果您有大量数据,并且有多个步骤要对它们进行填充,则对内存有影响,每个步骤都将其结果添加到映射中的新键下。 这样做会创建有效的不可变状态,您可以轻松地回溯等,但会产生一些影响。 由用户决定是否使状态不变...

    OneNoteBook V1.0.exe

    于是便用C++开发了这款OneNoteBook,我写了整整一年。 现在写好了,非常实用。在人际交往中总会遇到不顺心的事。 把与时间相关的人记录下来,同样的错不会犯第二遍。 这款OneNoteBook助您在人际交往的道路上畅通无阻。 ...

    高级C语言.PDF

    1. C 语言中的指针和内存泄漏 ............................................................................................................. 5 2. C语言难点分析整理 ..........................................

    creduce:C-Reduce,C程序简化程序

    笔记当设置为使用多个内核时,C-Reduce可能会导致/tmp空间泄漏。 发生这种情况是因为有时,当并行计算的结果明确表明编译器调用不再有用时,C-Reduce会终止编译器调用。 如果编译器在被杀死时将文件留在/tmp ,则C-...

    opentodolist:一个简单的Todo和任务管理应用程序-https的镜像

    OpenTodoList-一个待办事项和任务管理应用程序关于OpenTodoList是一个待办事项列表和笔记应用程序。 在库中组织待办事项列表,注释和图像,这些列表,注释和图像可以完全本地存储在您正在使用的设备上(从而确保没有...

Global site tag (gtag.js) - Google Analytics