effective C++学习---条款13:以对象管理资源

//本条款的前提是已知“资源取得时是初始化的最佳时机”
class Investment {}; //投资类型

Investment* createInvestment();  //一个创建对象的接口,返回创建的对象的地址

void f()//这种简单方式可能会在程序段的中间发生返回或抛出,造成无法执行delete,泄露内存
{
	Investment * pInv = createInvestment();//创建对象
	                                       
	//使用对象

	delete pInv;                           //使用完后释放对象
}

/*
把资源放进对象内,就可以依赖对象的析构函数被自动调用的机制来确保资源已经被释放
只能指针的使用,在堆中分配空间后,离开堆时,系统就回自动回收该块空间。
*/
void f()
{
	std::auto_ptr<Investment> pInv(createInvestment());
	//同样是创建对象
	//但是用智能指针这个对象将这段内存管理起来
	//在智能指针使用完毕,会释放自身对象的空间和指针指向的所有空间
	//回收指针指向的空间是写在析构函数中的,也就是和一定会被执行
}

/*
以对象管理资源的两个关键想法
1.获取资源后立即放进管理对象
2.管理对象运用析构函数确保资源被释放
*/


/*
智能指针不允许多个指针指向同一个对象,这样会对同一块空间释放多次
所以当尝试使用拷贝构造和等号赋值时,它们会变成Null,而复制所得的指针拥有该对象的唯一使用权
当程序中需要这种赋值功能时,智能指针就显的不太合适了。这就引入了计数型智慧指针。
*/
std::auto_ptr<Investment> pInv1(createInvestment());
std::auto_ptr<Investment> pInv2(pInv1);
pInv1 = pInv2;      //pInv2会被置null

void f()
{
	std::tr1::shared_ptr<Investment> pInv1(createInvestment());

	std::tr1::shared_ptr<Investment> pInv2(pInv1);

	pInv1 = pInv2;//可以进行正常赋值和使用

	//智慧指针刚好可以弥补只能指针的短板
}

/*
注意:智能指针和智慧指针只能释放delete,不能进行delete[]
所以把申请的空间给他们时,不要申请一个array,这样他们不能
释放所有空间
*/
std::auto_ptr<std::string> aps(new std::string[10]);

std::tr1::shared_ptr<int > spi(new int[1024]);
//以上两种都是不容许的

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值