Item 13 管理在堆上new出来的对象

本文探讨了资源获取即初始化(Resource Acquisition Is Initialization, RAII)的概念,并对比了std::auto_ptr与std::tr1::shared_ptr在资源管理方面的特点与区别。通过具体的代码示例,解释了它们如何在C++中安全地管理动态分配的对象。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

void f() { std::auto_ptr<Investment> pInv(createInvestment()); ... }

创建Investment资源之后立即交给资源管理器auto_ptr ,这叫Resource Acquisition Is Initialization (RAII)。
资源管理器在dtor里销毁资源。如果发生异常,会很麻烦。
不要用多个auto_ptr管理同一个资源。否则会发生多次销毁。auto_ptr本身也改装了copy动作(copy ctor和assignment operator)。

std::auto_ptr<Investment> pInv1(createInvestment()); std::auto_ptr<Investment> pInv2(pInv1); // pInv2 now points to the object; pInv1 is now null pInv1 = pInv2; // now pInv1 points to the object, and pInv2 is null

因为有着这种奇怪的拷贝行为,所以auto_ptr不能用于管理STL容器内的元素。STL容器要求,其元素必须能正常拷贝。
可使用“引用计数智能指针”:reference-counting smart pointer (RCSP)来代替auto_ptr。和垃圾收集类似,不同之外在于RCSP不能处理“循环引用”。
shared_ptr就是一种RCSP:

void f() { ... std::tr1::shared_ptr<Investment> pInv(createInvestment()); ... }

对于初始化,和auto_ptr没什么不同。

void f() { ... std::tr1::shared_ptr<Investment> pInv1(createInvestment()); std::tr1::shared_ptr<Investment> pInv2(pInv1); // both pInv1 and pInv2 now point to the object pInv1 = pInv2; // ditto — nothing has changed ... } // pInv1 and pInv2 are destroyed, and the object they point to is automatically deleted

auto_ptr和tr1::shared_ptr都用delete来析构对象,而非delete[]。所以不能管理对象数组。但是如果误用,编译器不报错。
boost::scoped_array和boost::shared_array可管理数组对象。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值