September 6th Thursday (九月 六日 木曜日)

本文详细介绍了C++中智能指针auto_ptr的工作原理及使用注意事项。解释了auto_ptr如何避免资源泄露,并讨论了其在不同场景下的正确用法。同时,文章对比了auto_ptr与其他类型指针的区别。

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

  The auto_ptr is an example of a smart pointer, an object that acts like a pointer, but with additional features.
The auto_ptr class is defined so that, in most respects, it acts like a regular pointer. For example, given that ps
is an auto_ptr, you can dereference it (*ps), increment it (++ps), use it to access structure members (ps->puffIndex),
and assign it to a regular pointer that points to the same type.

  The auto_ptr is not a panacea. For example, consider the following code:

auto_ptr<int> pi(new int [200]);   // NO!

  Remember, you must pair delete with new and delete [] with new []. The auto_ptr template uses delete, not delete [],
so it only can be used with new, not new []. There is no auto_ptr equivalent for use with dynamic arrays. You could copy
the auto_ptr template from the memory header file, rename it auto_arr_ptr, and convert the copy to use delete [] instead
of delete. In that case, you would want to add support for the [] operator.

  What about this?

string vacation("I wandered lonely as a cloud.");
auto_ptr<string> pvac(&vacation);  // NO!

  This would apply the delete operator to non-heap memory, which is wrong.

Caution:  Use an auto_ptr object only for memory allocated by new, not for memory allocated by new[] or by simply declaring
a variable.

  Now consider assignment:

auto_ptr<string> ps (new string("I reigned lonely as a cloud."));
auto_ptr<string> vocation;
vocation = ps;

  What should the assignment statement accomplish? If ps and vocation were ordinary pointers, the result would be two pointers
pointing to the same string object. That is not acceptable here, for then the program would wind up attempting to delete the same
object twice, once when ps expires, and once when vocation expires. There are ways to avoid this problem:

  Define the assignment operator so that it makes a deep copy. This results in two pointers pointing to two distinct objects,
one of which is a copy of the other.

  Institute the concept of ownership, with only one smart pointer allowed to own a particular object. Only if the smart pointer
owns the object will its constructor delete the object. Then have assignment transfer ownership. This is the strategy used for
auto_ptr.

  Create an even smarter pointer that keeps track of how many smart pointers refer to a particular object. This is called
reference counting. Assignment, for example, would increase the count by one, and the expiration of a pointer would decrease
the count by one. Only when the final pointer expires would delete be invoked.

  The same strategies, of course, would also be applied to the copy constructors.
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值