先给大家介绍一个很有用的内存泄露检测工具 vld-10 vld-10下载 , 使用非常简单,只要把它里面的静动态库加到vs的安装目录的vc目录下,然后复制vld.h文件到你项目中,在main文件中#include"vld.h",这样有内存泄露就会在输出栏中提示哪一样代码出现的内存泄露。
条款3:尽量用new和delete而不用malloc和free。
malloc和free不认得构造和析构函数,他们不会调用构造函数和析构函数。 delete [] array ;将会对array中的每个对象调用析构函数,但是 free array 则不会调用array中对象的析构函数。总之new 要有对应的delete , malloc要有对应的free。 最好不要new delete 和malloc free混用,一心一意用new delete
class Person
{
public:
int ID;
public:
Person(){std::cout<<"constructed"<<std::endl;};
Person(int id):ID(id){};
~Person(){std::cout<<"destroy"<<std::endl;};
};
#include "person.h"
#include "vld.h"
#include "vldapi.h"
#include <iostream>
using namespace std;
void test()
{
Person person_array[20];
}
int main()
{
/*
person* person_array[3];
person_array[0]=new person; 数组保存指向对象的指针
persom* person_array = new person[3]; 数组保存对象本身
*/
Person* p = new Person[2]; /// 创建类数组
Person* pperson[2];
pperson[0]=new Person;
delete pperson[0];
delete [] p; /// 释放类数组,如果这句改成delete p ; 那么只会调用一次析构函数释放一个对象。
p=NULL;
char* buffer = static_cast<char*>(malloc(sizeof(char)*20));
free(buffer);
char* buffer_array = new char[20];
delete [] buffer_array;
}
条款6:析构函数里对指针成员调用delete
大多数情况下,执行动态内存分配的的类都在构造函数里用new分配内存,然后在析构函数里用delete释放内存。
增加一个指针成员意味着几乎都要进行下面的工作:
·在每个构造函数里对指针进行初始化。对于一些构造函数,如果没有内存要分配给指针的话,指针要被初始化为0(即空指针)。
·删除现有的内存,通过赋值操作符分配给指针新的内存。
·在析构函数里删除指针。
#include "vld.h"
#include "vldapi.h"
#include <iostream>
using namespace std;
class Person
{
public:
int ID;
char* str;
public:
Person():ID(0){std::cout<<"constructed"<<std::endl;str=0;};
Person(int id):ID(id){std::cout<<"constructed"<<std::endl; str=new char[10]; };
//~Person(){std::cout<<"destroy"<<std::endl;}; 构造函数中new 申请了空间,那么在析构函数中要相应的delete,像这个析构函数就发生了泄露。
~Person(){std::cout<<"destroy"<<std::endl;delete str;};//在析构函数中相应的调用delete不会发生泄露。
};
int main()
{
Person* p = new Person;
delete p;
Person* p_memery = new Person(0);
delete p_memery;
};