内存泄漏的一个重要的原因是你忘记了在你的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
分享到:
相关推荐
理解内存管理是防止内存泄漏和悬空指针的关键。 七、预处理器 C++的预处理器负责处理宏定义、条件编译等任务。虽然现代编程推荐尽量减少对预处理器的依赖,但在某些特定场景下,它仍然非常有用。 八、输入/输出流 ...
了解栈和堆的区别,掌握动态内存分配与释放,防止内存泄漏,是每个C/C++程序员必备的技能。此外,深入理解引用(reference)这一C++特性,可以更安全地替代指针,避免一些潜在的问题。 预处理指令(如#include、宏...
11. **内存管理**:C++允许程序员直接管理内存,理解动态内存分配(`new`和`delete`)和内存泄漏的预防至关重要。 12. **文件操作**:C++提供了文件输入输出的功能,通过`fstream`库进行文件的读写操作,这对于数据...
7. **内存管理**:C++Builder中的智能指针和自动垃圾回收机制,避免内存泄漏问题。 学习这两门语言,你需要通过实践编写小程序来巩固理论知识,逐步掌握程序设计的思想和技巧。《C语言和C++Builder学习笔记.docx》...
7. **内存管理**:C++允许直接管理内存,包括动态分配和释放,但需要注意防止内存泄漏。指针是C++中重要的概念,用于间接访问内存地址。 8. **输入/输出流**:C++的I/O流库(iostream)提供了一种统一的方式来处理...
了解如何分配和释放内存,避免内存泄漏和悬挂指针,是编写安全、高效C++代码的必备技能。 8. **预处理器宏和编译指令**:虽然预处理器在现代C++中使用较少,但了解预处理器宏和条件编译对于阅读和理解现有代码仍然...
C++(day11).txt可能深入讲解了new和delete操作以及内存泄漏问题的预防。 6. 面向切面编程:虽然C++本身并不直接支持面向切面编程(AOP),但可以通过预处理器宏和元编程等技术实现类似的功能。这部分内容可能在某个...
- 深入理解动态内存分配(new和delete操作符)和栈与堆的区别,以及如何避免内存泄漏,这对于优化程序性能和防止错误至关重要。 6. **C++11新特性**: - C++11是C++的一个重要更新,引入了如右值引用、lambda...
4. **内存管理**:C++允许直接操作内存,包括动态内存分配与释放,理解内存管理有助于避免常见的程序错误,如内存泄漏。 5. **异常处理**:学习如何在代码中捕获和处理错误,异常处理是保证程序健壮性的关键部分。 ...
智能指针是另一种适配器,它们用来管理动态分配的对象的生命周期,防止内存泄漏。C++11之前,auto_ptr是智能指针的一种,但由于其特殊的所有权转移规则,容易造成危险,因此C++11引入了更为安全的智能指针如unique_...
- 内存管理:了解指针的概念,掌握动态内存分配和释放,避免内存泄漏。 - 文件操作:学习如何读写文件,实现数据持久化。 - 面向对象设计原则:包括封装、继承、多态,以及设计模式的应用。 - 标准模板库(STL):...
8. **内存管理**:理解动态内存分配(new/delete)、栈和堆的区别,以及智能指针的使用,这对于防止内存泄漏和提高程序性能非常重要。 9. **输入/输出流**:I/O流库(iostream)的使用,包括cin和cout的交互方式,...
7. **内存管理**:C++允许程序员直接管理内存,因此理解动态内存分配(new和delete)、堆和栈的区别以及内存泄漏等问题至关重要。 8. **异常处理**:C++的异常处理机制可以帮助编写健壮的代码,笔记会讲解try、...
C++笔记可能涉及CPU和GPU优化技巧,如减少内存访问、利用缓存、避免冗余计算等。同时,了解如何使用调试工具分析和解决性能问题也十分关键。 最后,C++游戏开发往往涉及跨平台问题。学习如何使用工具如SDL、SFML或...
C++学习笔记:关于C++类与动态内存分配中布局new操作符 在C++中,new操作符是一种动态内存分配方式,用于在堆上分配内存以存储对象。但是,在某些情况下,我们需要使用布局new操作符来分配内存,例如在现有的内存块...
了解内存管理原理,避免内存泄漏和悬挂指针是中级C++程序员必备技能。 7. **C++11及以后的更新**: 自C++11标准以来,C++引入了许多新特性,如右值引用(rvalue reference)、lambda表达式、auto关键字、move语义、...
4. 智能指针:智能指针如unique_ptr、shared_ptr和weak_ptr,用于自动管理动态分配的对象,防止内存泄漏。 5. C++11及更高版本的新特性:包括右值引用、lambda表达式、自动类型推断(auto)、范围for循环等,提升了...
理解这部分内容对于避免内存泄漏和理解C++的底层工作原理至关重要。 最后,笔记可能会涉及C++11及更高版本的新特性,如lambda表达式、右值引用、auto关键字和 constexpr 等,这些都是现代C++编程的重要组成部分,让...
它通过在构造函数中申请资源,在析构函数中释放资源来避免内存泄漏和死锁问题。在多线程中锁的获取与释放中,也可以充分利用RAII特性,避免每次返回都需要释放锁,避免冗余代码。 2. Pimpl(Point to ...
包括如何使用new和delete操作符,以及避免内存泄漏和野指针的问题。 8. **输入/输出流**:C++的iostream库提供了方便的输入输出操作,如cin和cout,用于处理标准输入和输出。 9. **命名空间**:命名空间有助于解决...