//本条款的前提是已知“资源取得时是初始化的最佳时机”
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]);
//以上两种都是不容许的
effective C++学习---条款13:以对象管理资源
最新推荐文章于 2022-07-13 10:25:04 发布