智能指针(模拟实现auto_ptr,shared_ptr,scooeptr 以及定制删除器c++ 实现)

#define  _CRT_SECURE_NO_WARNINGS

#include<iostream>
using namespace std;
template<class T>
class Auto_ptr
{
public:
 Auto_ptr(T* _x) :x(_x)
 {}
 Auto_ptr(Auto_ptr<T> &s) :x(s.x)
 {

  s.x = NULL;
 }
 Auto_ptr& operator=(Auto_ptr<T> &s)
 {
  x = s.x;
  s.x = NULL;
  
 }
 ~Auto_ptr()
 {

 }

private:
 T* x;

};

//template<class T>
//class Shared_ptr
//{
//public:
// Shared_ptr(T* _x=NULL) :x(_x), p(new int(0))
// {
//  ++*p;
// }
// Shared_ptr(Shared_ptr<T> &s) :x(s.x)
// {
//  ++*(s.p);
//  p = s.p;
// }
//
// Shared_ptr<T>& operator=(Shared_ptr<T> &s)
// {
//  if (this->x != s.x)
//  {
//   --*p;
//   x = s.x;
//   p = s.p;
//   ++*p;
//   return *this;
//  }
//
// }
// void Realease()
// {
//  delete x;
//  delete p;
//
// }
//
// ~Shared_ptr()
// {
//  if (--*p==0)
//  {
//   Realease();
//  }
// }
//
//private:
// T* x;
// int *p;
//
//
//};

template<class T>
class Scoped_ptr
{
public:
 Scoped_ptr(T *x) :_x(x), p(new int(1))
 {}
 
private:
 Scoped_ptr(const Scoped_ptr &s);
 Scoped_ptr operator=(const Scoped_ptr &s);
 
private:
 T* _x;
 int *p;
};

template<class T>
struct Del
{
 void operator()(const T* ptr)
 {
  cout << "Del" <<ptr<< endl;
  delete ptr;
 }
};

template<class T>
struct FFF
{
 void operator()(const T* ptr)
 {
  cout << "delete[]" << endl;
  delete[] ptr;
 }
};

struct Free//仿函数
{
 void operator() (void* ptr)
 {
  cout << "free:" << ptr << endl;
  free(ptr);
 }
};

struct Fclose
{
 void operator() (void* ptr)
 {
  cout << "fclose:" << ptr << endl;
  fclose((FILE*)ptr);
 }
};

template<class T,class Deleter =Del<T> >
class Shared_ptr
{
public:
 Shared_ptr(T *ptr) :_ptr(ptr), _refcount(new long(1))
 {}
 Shared_ptr(T *ptr, Deleter del) :_ptr(ptr), _refcount(new long(1)), _del(del)
 {}
 ~Shared_ptr()
 {
  Realease();
 }
 T& operator *();
 T* operator ->();

protected:
 void Realease()
 {
  if (--*_refcount == 0)
  {
   _del(_ptr);
   delete _refcount;
  }
 }

 
private:
 T *_ptr;
 Deleter _del;
 long *_refcount;
};

template<class T, class Deleter = Del<T> >
T& Shared_ptr<T,Deleter>::operator *()
{
 return *_ptr;
}

template<class T, class Deleter = Del<T> >
T* Shared_ptr<T, Deleter>::operator ->()
{
 return *_ptr;
}

void test1()
{
 Shared_ptr<int> s1(new int(10));
 //return 0;
 Shared_ptr<int, Free>s2((int*)malloc(sizeof(int)* 10), Free());

// Shared_ptr<int, Free>s2((int*)malloc(sizeof(int)* 10), Free());

 Shared_ptr<FILE, Fclose>s3(fopen("test.txt","w"), Fclose());

}
时间: 2024-09-29 09:20:20

智能指针(模拟实现auto_ptr,shared_ptr,scooeptr 以及定制删除器c++ 实现)的相关文章

实战c++中的智能指针unique_ptr系列-- unique_ptr的get_deleter方法(自定义删除器)

unique_ptr的成员函数在上一篇博客中几乎全部涵盖,其实还有一个很有踢掉,即std::unique_ptr::get_deleter 字面已经很明显了,就获得deleter: Returns the stored deleter The stored deleter is a callable object. A functional call to this object with a single argument of member type pointer is expected

【智能指针的延伸】两种定制删除器的实现方法

所谓定制删除器,就是向目标模板提供一个可以自由选择析构的接口,这样做的好处就是可以使智能指针模板不再只能单独管理内存,我们还可以用它管理文件指针之类的东西.其实现方法有两种,这里我们以share指针为例.   1.传递一个类的模板参数并给出缺省值,模板中将该类设定为成员变量,通过该类(删除类)的实例化,调用类中所存的删除方法进行删除. 代码如下: #include<iostream> template <class T> struct Del { void operator ()(

boost::shared_ptr与定制删除器

shared_ptr shared_ptr是一种智能指针,他的作用如同指针,但会记录有多少shared_ptr指向同一个对象.使用时必须引用头文件<boost/shared_ptr.hpp> template<class T> class ShartedPtr { public: //构造函数 ShartedPtr(T* ptr) :_ptr(ptr) , _pCount(new int(1)) { } //拷贝构造 ShartedPtr(const ShartedPtr<T

【C++】智能指针详解(四):shared_ptr

在开始本文内容之前,我们再来总结一下,前文内容: 1.智能指针采用RAII机制,在构造对象时进行资源的初始化,析构对象时进行资源的清理及汕尾. 2.auto_ptr防止拷贝后析构释放同一块内存,采用"转移所有权"的方法.(实际开发中auto_ptr并不实用) 3.scoped_ptr与auto_ptr类似,但是它与auto_ptr最大的区别是:它不能转移所有权,即就是禁止拷贝/赋值!(当然,我们也探讨了C++中禁止拷贝对象的技术,在此不赘述) 回顾完前文内容后,我们今天来讨论share

智能指针(一):STL auto_ptr实现原理

智能指针实际上是一个类(class),里面封装了一个指针.它的用处是啥呢? 指针与内存 说到指针自然涉及到内存.我们如果是在堆栈(stack)中分配了内存,用完后由系统去负责释放.如果是自定义类型,就会自动的去调用你的析构函数. 但如果是在堆(heap)中分配了内存,也就是用malloc或者new.那只能自动手动的使用free或delete去释放.所以使用heap时处理的不好很容易出现啥内存泄露(内存没有释放掉).或者如果你delete一次了,但没让它赋值为0,然后再delete一次就导致未定义

智能指针分析及auto_ptr源码

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

智能指针:模拟实现auto_ptr,scoped_ptr,shared_ptr

RAII(Resource Acquisition Is Initialization) 资源分配即初始化,定义一个类来封装资源的分配和释放,在构造函数完成资源的分配和初始化,在析构函数完成资源的清理,可以保证资源的正确初始化和释放. 所谓智能指针就是智能/自动化的管理指针所指向的动态资源的释放. STL--auto_ptr Boost库的智能指针(ps:新的C++11标准中已经引入了unique_ptr/shared_ptr/weak_ptr) 常见的智能指针有:auto_ptr/scoped

【C++】智能指针的作用,模拟实现auto_ptr,scoped_ptr,shared_ptr

RAII(Resource Acquisition Is Initialization): 资源分配即初始化,定义封装一个类,用来实现调用构造函数时就可完成资源的分配和初始化,在调用析构函数就可完成资源的清理,以实现对资源的初始化和清理. 智能指针: 用自动化或者说智能的指针来实现对动态内存的释放. 它是一个类,有类似指针的功能. 常见的智能指针有:auto_ptr/scoped_ptr/scoped_array/shared_ptr/shared_array,我们今天先讲以下三种. 一.Aut

C++智能指针: auto_ptr, shared_ptr, unique_ptr, weak_ptr

本文参考C++智能指针简单剖析 内存泄露 我们知道一个对象(变量)的生命周期结束的时候, 会自动释放掉其占用的内存(例如局部变量在包含它的第一个括号结束的时候自动释放掉内存) int main () { { int a = 1; printf("%d\n", a); } { a = 2; printf("%d\n", a); } } 这样会编译错误. 但是如果这样写呢? void func(int &o) { int *p = new int(o); ret