智能指针auto_ptr源码剖析

何时我们需要智能指针?

  1. 资源所有权的共享

    共享所有权是指两个或多个对象需要同时使用第三个对象的情况。这第三个对象应该如何(或者说何时)被释放?为了确保释放的时机是正确的,每个使用这个共享资源的对象必须互相知道对方,才能准确掌握资源的释放时间。从设计或维护的观点来看,这种耦合是不可行的。更好的方法是让这些资源所有者将资源的生存期管理责任委派给一个智能指针。当没有共享者存在时,智能指针就可以安全地释放这个资源了。

  2. 要编写异常安全的代码时

    异常安全简单地说就是在异常抛出时没有资源泄漏并保证程序状态的一致性。如果一个对象是动态分配的,当异常抛出时它不会自动被删除。由于栈展开以及指针离开作用域,资源可以会泄漏直至程序结束(即使是程序结束时的资源回收也不是由语言所保证的)。不仅可能程序会由于内存泄漏而耗尽资源,程序的状态也可能变得混乱。智能指针可以自动地为你释放这些资源,即使是在异常发生的情况下。

  3. 避免常见的错误,如资源泄漏

    避免常见的错误。忘记调用 delete 是书本中最古老的错误(至少在这本书中)。一个智能指针不关心程序中的控制路径;它只关心在它所指向的对象的生存期结束时删除它。使用智能指针,你不再需要知道何时删除对象。并且,智能指针隐藏了释放资源的细节,因此使用者不需要知道是否要调用 delete, 有些特殊的清除函数并不总是删除资源的。

下面我们来介绍一下智能指针auto_ptr

以下为简化后的auto_ptr的源码:

#include<iostream>
#include<string>
using namespace std;

template<class _Ty> class auto_ptr
{
public:
    typedef auto_ptr<_Ty> _Myt;//自身类型
    typedef _Ty element_type;//所指对象类型

    explicit auto_ptr(_Ty *_Ptr = 0): _Myptr(_Ptr)//显式的构造函数 默认构造一个空指针
    {
    }

    auto_ptr(_Myt& _Right): _Myptr(_Right.release())//复制构造函数
    {
    }

    _Myt& operator=(_Myt& _Right)//重载赋值运算符
    {
        reset(_Right.release());
        return (*this);
    }

    ~auto_ptr()//析构函数
    {
        delete _Myptr;
    }

    template<class _Other>  operator auto_ptr<_Other>()//将对象的地址转换为auto_ptr类型
    {
        return (auto_ptr<_Other>(*this));
    }

    _Ty& operator*() const//重载*运算符 获得所指对象内容
    {
        if (_Myptr == 0)
            _DEBUG_ERROR("auto_ptr not dereferencable");
        return (*get());
    }

    _Ty *operator->() const // 重载->运算符 获得所指对象地址
    {
        if (_Myptr == 0)
            _DEBUG_ERROR("auto_ptr not dereferencable");
        return (get());
    }

    _Ty *get() const //返回自身的值,即所指对象的地址
    {
        return (_Myptr);
    }

    _Ty *release() //返回当前对象的地址, 并将指针置空, 即放弃所占资源
    {
        _Ty *_Tmp = _Myptr;
        _Myptr = 0;
        return (_Tmp);
    }

    void reset(_Ty *_Ptr = 0)//释放所指对象, 将指针指向另一个对象
    {
        if (_Ptr != _Myptr)
            delete _Myptr;
        _Myptr = _Ptr;
    }

private:
    _Ty *_Myptr;    // 指向对象的指针
};

int main()
{
    auto_ptr<string> p (new string("xiaohuai"));

    return 0;
}

auto_ptr是怎样实现资源所有权的转让呢?

我们从源码中的复制构造函数可以看出,它调用了函数release()

**从函数release的源码中我们可以看出,它先将原来的指针保存起来进temp,然后将原指针置空,最后将temp返回

这样我们在复制构造函数中用temp初始化了另一个对象,这样的操作就是将原有的资源所有权转让给了另一个对象,赋值同理**

时间: 2024-08-12 20:34:35

智能指针auto_ptr源码剖析的相关文章

C++:浅谈c++资源管理以及对[STL]智能指针auto_ptr源码分析,左值与右值

C++:浅谈c++资源管理以及对[STL]智能指针auto_ptr源码分析 by 小威威 1. 知识引入 在C++编程中,动态分配的内存在使用完毕之后一般都要delete(释放),否则就会造成内存泄漏,导致不必要的后果.虽然大多数初学者都会有这样的意识,但是有些却不以为意.我曾问我的同学关于动态内存的分配与释放,他的回答是:"只要保证new和delete成对出现就行了.如果在构造函数中new(动态分配内存),那么在析构函数中delete(释放)就可以避免内存泄漏了!" 事实果真如此么?

vc 下和Linux 下的auto_ptr源码剖析

1.vc template<class _Ty> class auto_ptr { public: typedef _Ty element_type; auto_ptr(_Ty *_P = 0)  : _Owns(_P != 0), _Ptr(_P) {} //拷贝构造  将_Y的管理权_Owns = false 释放后将指针赋值过去 auto_ptr(const auto_ptr<_Ty>& _Y) : _Owns(_Y._Owns), _Ptr(_Y.release()

auto_ptr源码剖析

/*  * Copyright (c) 1997-1999  * Silicon Graphics Computer Systems, Inc.  *  * Permission to use, copy, modify, distribute and sell this software  * and its documentation for any purpose is hereby granted without fee,  * provided that the above copyr

智能指针分析及auto_ptr源码

简介 C++没有内存自动回收机制,对堆内存的管理就是简单的new和delete,每次new出来的内存都需要手动delete释放.但由于忘记.流程复杂或者异常退出等,都有可能导致没有执行delete释放内存,造成内存泄漏. 在实际工程中,我们往往希望将精力放在应用层上而不是费劲心思处理语言的细枝末节(内存释放),于是就有了最原始的只能指针auto_ptr. 智能指针原理 智能指针是一种资源管理类,这个类在构造函数中传入一个原始指针,在析构函数中释放传入的指针.智能指针都是栈上的对象,所以当函数(或

c++ stl源码剖析学习笔记(二)iterator auto_ptr(老版本书籍示例 新版本C++中已经废除此概念)

ITERATOR template<class InputIterator,class T> InputIterator find(InputIterator first,InputIterator last,const T& value) { while(first != last && *first != value) ++first; return first; } 代码示例 1 #include <iostream> 2 #include <v

[转载]《STL源码剖析》阅读笔记之 迭代器及traits编程技法

本文从三方面总结迭代器   迭代器的思想   迭代器相应型别及traits思想   __type_traits思想 一 迭代器思想 迭代器的主要思想源于迭代器模式,其定义如下:提供一种方法,使之能够依序巡防某个聚合物(容 器)所含的元素,而又无需暴露该聚合物的内部表达式.可见她的主要作用便是能够降低耦合,提高代码的 模块性. STL的的中心思想在于:将数据容器和算法分开,彼此独立设计,最后再以一贴胶着剂将它们撮合 在一起,这贴胶着剂便是迭代器.迭代器的行为类似智能指针(例如标准库的auto_pt

STL&quot;源码&quot;剖析-重点知识总结

STL是C++重要的组件之一,大学时看过<STL源码剖析>这本书,这几天复习了一下,总结出以下LZ认为比较重要的知识点,内容有点略多 :) 1.STL概述 STL提供六大组件,彼此可以组合套用: 容器(Containers):各种数据结构,如:vector.list.deque.set.map.用来存放数据.从实现的角度来看,STL容器是一种class template. 算法(algorithms):各种常用算法,如:sort.search.copy.erase.从实现的角度来看,STL算法

【转载】STL&quot;源码&quot;剖析-重点知识总结

原文:STL"源码"剖析-重点知识总结 STL是C++重要的组件之一,大学时看过<STL源码剖析>这本书,这几天复习了一下,总结出以下LZ认为比较重要的知识点,内容有点略多 :) 1.STL概述 STL提供六大组件,彼此可以组合套用: 容器(Containers):各种数据结构,如:vector.list.deque.set.map.用来存放数据.从实现的角度来看,STL容器是一种class template. 算法(algorithms):各种常用算法,如:sort.se

C++智能指针 auto_ptr

C++智能指针 auto_ptr auto_ptr 是一个轻量级的智能指针, 定义于 memory (非memory.h)中, 命名空间为 std. auto_ptr 适合用来管理生命周期比较短或者不会被远距离传递的动态对象, 最好是局限于某个函数内部或者是某个类的内部. 使用方法: std::auto_ptr<int> pt(new int(10)); pt.reset(new int(11)); 成员函数 3个重要的函数: (1) get 获得内部对象的指针, 由于已经重载了()方法, 因