内存泄漏的一个重要的原因是你忘记了在你的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
分享到:
相关推荐
(4)垃圾回收机制 --- 自动垃圾收集,永远不会出现内存泄露的问题 4、虚拟机 java语言是先编译后解释,java源码是通过编译生成一种特殊的.class的中间字节码文件,然后再由JVM进行解释运行。 (编译) (解释...
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...
一.用引用操纵对象 每种编程语言都有自己的数据操纵方式。有时候,程序员必须注意将要处理的数据是什么类型。...这样做就消除了这类编程问题(即“内存泄漏”),这是由于程序员忘记是放内存而产生的问题。
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...
java较为简单,例如:java不再支持多继承,C++是支持多继承的,多继承比较复杂,C++中有指针,java中屏蔽了指针的概念,避免了绝大部分的指针越界和内存泄露的问题,这里说明一下,java语言低层是用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中可变参数函数...
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...
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...
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...
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...
代码比较冗余同时可能存在内存泄漏,仅供参考 另外附带了简易记事本功能(是为了验证QtforAndroid是否和电脑端保存文件的方式是否支持,得到的结论是使用电脑端形如:"D:\\A\a.txt"的存储方式,但是在手机端没有找到...
这些漏洞可能构成严重的利用风险,并导致系统受损,信息泄漏甚至进一步的财务损失。 不幸的是,测试和手动代码审查不能总是找到每个漏洞。 为了解决该问题,我们正在使用一种高效的机器学习驱动方法来解决这一日益...
如果您有大量数据,并且有多个步骤要对它们进行填充,则对内存有影响,每个步骤都将其结果添加到映射中的新键下。 这样做会创建有效的不可变状态,您可以轻松地回溯等,但会产生一些影响。 由用户决定是否使状态不变...
于是便用C++开发了这款OneNoteBook,我写了整整一年。 现在写好了,非常实用。在人际交往中总会遇到不顺心的事。 把与时间相关的人记录下来,同样的错不会犯第二遍。 这款OneNoteBook助您在人际交往的道路上畅通无阻。 ...
1. C 语言中的指针和内存泄漏 ............................................................................................................. 5 2. C语言难点分析整理 ..........................................
笔记当设置为使用多个内核时,C-Reduce可能会导致/tmp空间泄漏。 发生这种情况是因为有时,当并行计算的结果明确表明编译器调用不再有用时,C-Reduce会终止编译器调用。 如果编译器在被杀死时将文件留在/tmp ,则C-...
OpenTodoList-一个待办事项和任务管理应用程序关于OpenTodoList是一个待办事项列表和笔记应用程序。 在库中组织待办事项列表,注释和图像,这些列表,注释和图像可以完全本地存储在您正在使用的设备上(从而确保没有...