`
yexin218
  • 浏览: 970983 次
  • 性别: 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  
记得大二时上系统程序设计也玩过这些东西。

相关推荐

    C++快速复习笔记.rar

    理解内存管理是防止内存泄漏和悬空指针的关键。 七、预处理器 C++的预处理器负责处理宏定义、条件编译等任务。虽然现代编程推荐尽量减少对预处理器的依赖,但在某些特定场景下,它仍然非常有用。 八、输入/输出流 ...

    C/C++开发实战笔记

    了解栈和堆的区别,掌握动态内存分配与释放,防止内存泄漏,是每个C/C++程序员必备的技能。此外,深入理解引用(reference)这一C++特性,可以更安全地替代指针,避免一些潜在的问题。 预处理指令(如#include、宏...

    达内c++培训课程笔记

    11. **内存管理**:C++允许程序员直接管理内存,理解动态内存分配(`new`和`delete`)和内存泄漏的预防至关重要。 12. **文件操作**:C++提供了文件输入输出的功能,通过`fstream`库进行文件的读写操作,这对于数据...

    C语言和C++Builder学习笔记.rar_C++笔记_c++学习笔记_c/C++_学习笔记_编程语言

    7. **内存管理**:C++Builder中的智能指针和自动垃圾回收机制,避免内存泄漏问题。 学习这两门语言,你需要通过实践编写小程序来巩固理论知识,逐步掌握程序设计的思想和技巧。《C语言和C++Builder学习笔记.docx》...

    C++笔记.rar C++笔记.rar

    7. **内存管理**:C++允许直接管理内存,包括动态分配和释放,但需要注意防止内存泄漏。指针是C++中重要的概念,用于间接访问内存地址。 8. **输入/输出流**:C++的I/O流库(iostream)提供了一种统一的方式来处理...

    C++ 学习笔记 整理

    了解如何分配和释放内存,避免内存泄漏和悬挂指针,是编写安全、高效C++代码的必备技能。 8. **预处理器宏和编译指令**:虽然预处理器在现代C++中使用较少,但了解预处理器宏和条件编译对于阅读和理解现有代码仍然...

    c++源码笔记_非常值得一看

    C++(day11).txt可能深入讲解了new和delete操作以及内存泄漏问题的预防。 6. 面向切面编程:虽然C++本身并不直接支持面向切面编程(AOP),但可以通过预处理器宏和元编程等技术实现类似的功能。这部分内容可能在某个...

    达内C++课程笔记

    - 深入理解动态内存分配(new和delete操作符)和栈与堆的区别,以及如何避免内存泄漏,这对于优化程序性能和防止错误至关重要。 6. **C++11新特性**: - C++11是C++的一个重要更新,引入了如右值引用、lambda...

    C%2B%2B 达内科技 c++ 课件 及 源码 笔记【完美版】【初学者福音】

    4. **内存管理**:C++允许直接操作内存,包括动态内存分配与释放,理解内存管理有助于避免常见的程序错误,如内存泄漏。 5. **异常处理**:学习如何在代码中捕获和处理错误,异常处理是保证程序健壮性的关键部分。 ...

    C++STL学习笔记.pdf

    智能指针是另一种适配器,它们用来管理动态分配的对象的生命周期,防止内存泄漏。C++11之前,auto_ptr是智能指针的一种,但由于其特殊的所有权转移规则,容易造成危险,因此C++11引入了更为安全的智能指针如unique_...

    C++学习笔记.doc

    - 内存管理:了解指针的概念,掌握动态内存分配和释放,避免内存泄漏。 - 文件操作:学习如何读写文件,实现数据持久化。 - 面向对象设计原则:包括封装、继承、多态,以及设计模式的应用。 - 标准模板库(STL):...

    传智播客C++课程笔记

    8. **内存管理**:理解动态内存分配(new/delete)、栈和堆的区别,以及智能指针的使用,这对于防止内存泄漏和提高程序性能非常重要。 9. **输入/输出流**:I/O流库(iostream)的使用,包括cin和cout的交互方式,...

    达内学生的C++学习笔记

    7. **内存管理**:C++允许程序员直接管理内存,因此理解动态内存分配(new和delete)、堆和栈的区别以及内存泄漏等问题至关重要。 8. **异常处理**:C++的异常处理机制可以帮助编写健壮的代码,笔记会讲解try、...

    C++游戏开发笔记全集

    C++笔记可能涉及CPU和GPU优化技巧,如减少内存访问、利用缓存、避免冗余计算等。同时,了解如何使用调试工具分析和解决性能问题也十分关键。 最后,C++游戏开发往往涉及跨平台问题。学习如何使用工具如SDL、SFML或...

    C++学习笔记:关于C++类与动态内存分配中布局new操作符

    C++学习笔记:关于C++类与动态内存分配中布局new操作符 在C++中,new操作符是一种动态内存分配方式,用于在堆上分配内存以存储对象。但是,在某些情况下,我们需要使用布局new操作符来分配内存,例如在现有的内存块...

    笔记整理 C++中级学习笔记

    了解内存管理原理,避免内存泄漏和悬挂指针是中级C++程序员必备技能。 7. **C++11及以后的更新**: 自C++11标准以来,C++引入了许多新特性,如右值引用(rvalue reference)、lambda表达式、auto关键字、move语义、...

    c++个人笔记总结.rar

    4. 智能指针:智能指针如unique_ptr、shared_ptr和weak_ptr,用于自动管理动态分配的对象,防止内存泄漏。 5. C++11及更高版本的新特性:包括右值引用、lambda表达式、自动类型推断(auto)、范围for循环等,提升了...

    c++笔记(详细介绍了c++,很全,简单易懂)

    理解这部分内容对于避免内存泄漏和理解C++的底层工作原理至关重要。 最后,笔记可能会涉及C++11及更高版本的新特性,如lambda表达式、右值引用、auto关键字和 constexpr 等,这些都是现代C++编程的重要组成部分,让...

    C++服务器开发精髓笔记

    它通过在构造函数中申请资源,在析构函数中释放资源来避免内存泄漏和死锁问题。在多线程中锁的获取与释放中,也可以充分利用RAII特性,避免每次返回都需要释放锁,避免冗余代码。 2. Pimpl(Point to ...

    c++源码 学习笔记

    包括如何使用new和delete操作符,以及避免内存泄漏和野指针的问题。 8. **输入/输出流**:C++的iostream库提供了方便的输入输出操作,如cin和cout,用于处理标准输入和输出。 9. **命名空间**:命名空间有助于解决...

Global site tag (gtag.js) - Google Analytics