Effective c++ 条款3、6:new、delete和malloc、free

先给大家介绍一个很有用的内存泄露检测工具 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;
};


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值