C++智能指针大总结


//最挫的智能指针。
#include<iostream>
using namespace std;
template<typename Type>
class my_auto_ptr
{
public:
    my_auto_ptr(Type* p = NULL) :ptr(p){}
    my_auto_ptr(const my_auto_ptr& ma)
    {
        ptr = ma.realse();
    }
    my_auto_ptr& operator=(const my_auto_ptr& ma)
    {
        if (this != &ma)
        {
            this->realse();
            ptr = ma.realse();
        }
        return *this;
    }
    ~my_auto_ptr()
    {
        if (ptr != NULL)
        {
            cout << "free" << endl;
            delete ptr;
            ptr = NULL;
        }
    }
    Type* realse()const
    {
        Type* temp = ptr;
        (Type*)ptr = NULL;
        return temp;
    }
    Type operator*()
    {
        return *ptr;
    }
    Type* operator->()
    {
        return ptr;
    }
private:
    Type *ptr;
};
int main()
{
    my_auto_ptr<int> ps(new int(1000));
    cout << *ps << endl;
    my_auto_ptr<int> pb;
        pb = ps;
    //pb = ps;
    return 0;
}

#include <iostream>
using namespace std;
//vs2013里面的智能指针。
template<typename Type>
class my_auto_ptr
{
public:
    my_auto_ptr(Type *p = NULL):ptr(p), owns(p!=NULL){}
    my_auto_ptr(const my_auto_ptr &ma)
    {
        ptr = ma.relase();
    }
    my_auto_ptr& operator=(const my_auto_ptr &ma)
    {
        if (this != &ma)
        {
            this->relase();
            ptr = ma.relase();
            owns = true;
        }
        return *this;
    }
    Type* relase()const
    {
        ((my_auto_ptr*)this)->owns = false;
        return ptr;
    }
    ~my_auto_ptr()
    {
        if (owns)
        {
            cout << "free" << endl;
            delete ptr;
            ptr = NULL;
        }
    }
    Type operator*()
    {
        return *ptr;
    }
    Type* operator->()
    {
        return ptr;
    }
private:
    Type *ptr;
    bool owns;
};
int main()
{
    my_auto_ptr<int> ps(new int(10));
    my_auto_ptr<int> pb;
    pb = ps;
    //cout << *ps << endl;
    return 0;
}

#include <iostream>
using namespace std;
//唯一对象智能指针。
template<typename Type>
class my_auto_ptr
{
public:
    my_auto_ptr(Type *p = NULL) :ptr(p){}
    ~my_auto_ptr()
    {
        if (ptr != NULL)
        {
            delete ptr;
            ptr = NULL;
        }
    }
    Type& operator*()
    {
        return *ptr;
    }
    Type* operator->()
    {
        return ptr;
    }
protected:
    my_auto_ptr& operator=(const my_auto_ptr& ma);
    my_auto_ptr(const my_auto_ptr& ma);
private:
    Type *ptr;
};
int main()
{
    my_auto_ptr<int> ps(new int(3));
    cout << *ps << endl;
    return 0;
}

#include <iostream>
using namespace std;
//引用计数的智能指针。
template<typename Type>
class my_auto_ptr
{
public:
    my_auto_ptr(Type *p = NULL) :ptr(p)
    {
        count = new int[1];
        count[0] = 1;
    }
    my_auto_ptr(const my_auto_ptr& ma)
    {
        count = ma.count;
        count[0]++;
        ptr = ma.ptr;
    }
    my_auto_ptr& operator=(const my_auto_ptr& ma)
    {
        if (this != &ma)
        {
            this->~my_auto_ptr();
            count = ma.count;
            count[0]++;
            ptr = ma.ptr;
        }
        return *this;
    }
    ~my_auto_ptr()
    {
        if (count!=NULL && count[0]-- == 1)
        {
            cout << "free" << endl;
            delete ptr;
            ptr = NULL;
            delete[] count;
            count = NULL;
        }
    }
    Type operator*()
    {
        reutrn *ptr;
    }
    Type* operator->()
    {
        return ptr;
    }
private:
    Type* ptr;
    int *count;
};
int main()
{
    my_auto_ptr<int> ps(new int(100));
    my_auto_ptr<int> pb(ps);
    my_auto_ptr<int> pd(new int(200));
    pd = pb;
    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-29 10:13:47

C++智能指针大总结的相关文章

C++智能指针剖析(下)boost::shared_ptr&amp;其他

1. boost::shared_ptr 前面我已经讲解了两个比较简单的智能指针,它们都有各自的优缺点.由于 boost::scoped_ptr 独享所有权,当我们真真需要复制智能指针时,需求便满足不了了,如此我们再引入一个智能指针,专门用于处理复制,参数传递的情况,这便是如下的boost::shared_ptr. boost::shared_ptr 属于 boost 库,定义在 namespace boost 中,包含头文件#include<boost/smart_ptr.hpp> 便可以使

基于C/S架构的3D对战网络游戏C++框架 _05搭建系统开发环境与Boost智能指针、内存池初步了解

本系列博客主要是以对战游戏为背景介绍3D对战网络游戏常用的开发技术以及C++高级编程技巧,有了这些知识,就可以开发出中小型游戏项目或3D工业仿真项目. 笔者将分为以下三个部分向大家介绍(每日更新): 1.实现基本通信框架,包括对游戏的需求分析.设计及开发环境和通信框架的搭建: 2.实现网络底层操作,包括创建线程池.序列化网络包等: 3.实战演练,实现类似于CS反恐精英的3D对战网络游戏: 技术要点:C++面向对象思想.网络编程.Qt界面开发.Qt控件知识.Boost智能指针.STL算法.STL.

C++智能指针类模板

1.智能指针本质上是一个对象,这个对象可以像原生的一样来进行使用.原因是智能指针对象对应的类中,将指针相关的操作都进行了重载操作处理,所以才会达到这种像是原生的效果. 2.智能指针的意义: 现在C++开发库中最重要的类模板之一 C++中自动内存管理的主要手段 能够在很大程度上避开内存相关的问题 3.在QT中开发库中也提供了智能指针类模板,在STL标准库中也提供了,在c++的标准库忘了什么名了中也提供了智能指针类模板.所以智能指针类模板在C++中的地位很重要 4.STL中的智能指针类模板 auto

智能指针

RAII(Resource Acquisition Is Initialization) 资源分配即初始化,定义一个类来封装资源的分配和释放,在构造函数完成资源的分配和初始化,在析构函数完成资源的清理,可以保证资源的正确初始化和释放. ------------------------------------------------------------------------------------------- 为什么要有智能指针呢? 智能指针的存在是为了防止我们在大型项目中忘记释放空间而导

浅谈RAII&智能指针

关于RAII,官方给出的解释是这样的"资源获取就是初始化".听起来貌似不是很懂的哈,其实说的通俗点的话就是它是一种管理资源,避免内存泄漏的一种方法.它可以保证在各种情况下,当你对对象进行使用时先通过构造函数来进行资源的分配和初始化,最后通过析构函数来进行清理,有效的保证了资源的正确分配和释放.(特别是在异常中,因为异常往往会改变代码正确的执行顺序,这就很容易引起资源管理的混乱和内存的泄漏) 其中智能指针就是RAII的一种实现模式,所谓的智能就是它可以自动化的来管理它所指向那份空间的资源

C++ 智能指针

本文转自: http://blog.csdn.net/xt_xiaotian/article/details/5714477 (纯属自学转载) 一.简介 由于 C++ 语言没有自动内存回收机制,程序员每次 new 出来的内存都要手动 delete.程序员忘记 delete,流程太复杂,最终导致没有 delete,异常导致程序过早退出,没有执行 delete 的情况并不罕见. 用智能指针便可以有效缓解这类问题,本文主要讲解参见的智能指针的用法.包括:std::auto_ptr.boost::sco

Boost智能指针-基础篇

简介 内存管理一直是 C++ 一个比较繁琐的问题,而智能指针却可以很好的解决这个问题,在初始化时就已经预定了删除,排解了后顾之忧.1998年修订的第一版C++标准只提供了一种智能指针:std::auto_ptr(现以废弃),它基本上就像是个普通的指针:通过地址来访问一个动态分配的对象.std::auto_ptr之所以被看作是智能指针,是因为它会在析构的时候调用delete操作符来自动释放所包含的对象.当然这要求在初始化的时候,传给它一个由new操作符返回的对象的地址.既然std::auto_pt

【C++深入浅出】智能指针之auto_ptr学习

起:  C++98标准加入auto_ptr,即智能指针,C++11加入shared_ptr和weak_ptr两种智能指针,先从auto_ptr的定义学习一下auto_ptr的用法. template<class _Ty> class auto_ptr { // wrap an object pointer to ensure destruction public: //定义_Myt类型,作用域局限于类中,便于书写和理解 typedef auto_ptr<_Ty> _Myt; typ

引用内部函数绑定机制,R转义字符,C++引用,别名,模板元,宏,断言,C++多线程,C++智能指针

 1.引用内部函数绑定机制 #include<iostream> #include<functional> usingnamespacestd; usingnamespacestd::placeholders; //仿函数.创建一个函数指针,引用一个结构体内部或者一个类内部的共同拥有函数 structMyStruct { voidadd(inta) { cout <<a <<endl; } voidadd2(inta,intb) { cout <&