本文,记录auto_ptr
设计来源:
某函数退出时,本地变量都将被从堆内存中删除。因此,指针ps占据的内存将被释放,如果ps指向的内存也被释放,那将实现自动回收垃圾的机制。这意味着希望程序在ps过期时采用另一项额外的措施。简单来说,就是:类似new,却不需要担心delete问题。
对于基本类型,并没有提供这种额外的服务,但对于类,则可以通过析构函数机制来提供。
因此,ps的问题在于:它只是一个常规指针,不是类对象。如果它是对象,则可以在对象过期时,让它的析构函数删除被指向的内存。
这正是auto_ptr背后的思想。
实现:
auto_ptr是一种智能指针(smart pointer),类似于指针,但特性比指针多。需要实现其像指针一般的操作:解引用、递增、访问结构成员、赋予相同类型指针。
包含头文件:memory
存在问题:
- auto_ptr使用new,则使用delete删除,所以不能使用new []创建
- 不能使用于非堆内存
- 两个auto_ptr同时指向同一对象,不加处理,则对该对象进行两次释放
处理做法:
- 定义赋值操作符,使之执行深拷贝。这样两个指针将指向不同对象,其中一个对象是另一个对象的拷贝。
- 建立所有权概念,对于特定的对象,只能由一个智能指针可拥有它。智能指针的构造函数只能删除该指针拥有的对象。并使复制操作转让所有权。
- 创建智能更高的指针,跟踪引用特定对象的智能指针数。这被称为引用计数。仅当最后一个指针过期时,delete才被调用。