C++ 智能指针的简单实现

  • 智能指针的用处:在c++中,使用普通指针容易造成堆内存的泄露问题,即程序员会忘记释放,以及二次释放,程序发生异常时内存泄漏等问题,而使用智能指针可以更好的管理堆内存。注意,在这里智能指针是一个类而非真正的指针,只是对一个真正的指针进行包装,代理原指针。通过操作符的重载,可以让智能指针和真正的指针有类似的操作。
  • 如何实现:在智能指针析构函数当中,可以对代理的原指针进行delete以及赋空指针等操作,智能指针销毁时,自动调用析构函数,省去了程序员自己管理指针的操作。当多个智能指针代理同一个指针时,我们要引入一个计数器,用来计数智能指针的个数,最后一个销毁的智能指针有义务对原指针进行销毁工作,具体实现代码如下:
template<class T>
class Smart_ptr {
public:
    Smart_ptr(T*ptr);
    Smart_ptr(const Smart_ptr &ptr);//拷贝构造函数
    ~Smart_ptr();//析构函数
    int get_cnt();//获得当前代理原指针的智能指针个数
    Smart_ptr& operator=(const Smart_ptr&ptr);//赋值操作
    T& operator *();//指针操作
    T* operator ->();//指针操作
private:
    T*_ptr;
    int*_cnt;
};
template<class T>
Smart_ptr<T>::Smart_ptr(T*ptr):_ptr(ptr) {//判断参数指针是否为空;不为空,计数+1
    if (_ptr) _cnt = new int(1);
    else _cnt = new int(0);
}
template<class T>
Smart_ptr<T>::Smart_ptr(const Smart_ptr &ptr) {//复制构造函数,复制成功,计数加1
    if (this != &ptr) {
        this->_ptr = ptr._ptr;
        this->_cnt = ptr._cnt;
        (*this->_cnt)++;
    }
}
template<class T>
Smart_ptr<T>::~Smart_ptr() {//若当前的智能指针是最后一个代理指针,负责销毁原指针
    (*this->_cnt)--;
    if ((*this->_cnt) == 0) {
        delete this->_cnt;
        delete this->_ptr;
        _cnt = nullptr;
        _ptr = nullptr;
    }
}
template<class T>
Smart_ptr<T>& Smart_ptr<T>::operator=(const Smart_ptr&ptr) {//1:若赋值前后代理的指针是一样的,直接返回即可2:先判断当前的智能指针是否为最后一个代理原指针的智能指针,若是,销毁原指针;
    if (this->_ptr == ptr._ptr)return *this;//3:当前智能指针将代理一个新的指针
    if (this->_ptr != nullptr) {
        (*this->_cnt)--;
        if (*this->_cnt == 0) {
            delete this->_cnt;
            delete this->_ptr;
        }
    }
    this->_cnt = ptr._cnt;
    this->_ptr = ptr._ptr;
    (*this->_cnt)++;
    return *this;
}
template<class T>
T& Smart_ptr<T>::operator *() {//指针操作
    return *(this->_ptr);
}
template<class T>
T* Smart_ptr<T>::operator->() {//指针操作
    return this->_ptr;
}
template<class T>
int Smart_ptr<T>::get_cnt() {
    return *this->_cnt;
}

main函数:

int main() {
    Smart_ptr<int>sp1(new int(1));
    cout <<"sp1.cnt:"<< sp1.get_cnt() << endl;
    Smart_ptr<int>sp2(sp1);
    cout << "sp1.cnt:" << sp1.get_cnt() << endl;
    Smart_ptr<int>sp3(new int(10));
    cout << "sp3.cnt:" << sp3.get_cnt() << endl;;
    sp3 = sp2;
    cout << "sp3.cnt:" << sp3.get_cnt() << endl;
    return 0;
}

调用结果:

原文地址:https://www.cnblogs.com/ZefengYao/p/9465341.html

时间: 2024-10-13 10:34:02

C++ 智能指针的简单实现的相关文章

智能指针的简单剖析和实现

在C语言中我们用指针来进行内存管理,这也是C语言的强大之处.然而,也正是指针的存在使得C语言变得令人懊恼,内存泄漏.垂悬指针等等问题.强大的C++则采用智能指针(Smart_Ptr)来处理这个问题. 好了,什么是智能指针呢?智能指针的行为类似常规指针,重要的区别是它负责自动释放所指向的对象.这样以防止内存泄漏. 智能指针都有哪些种类呢? 通过上述表格可以看出有如此多的智能指针,C11标准库已经引进unique_ptr/shared_ptr/weak_ptr供我们使用. 下面来简单谈谈这些指针的原

智能指针的简单总结

1. 智能指针背后的设计思想 我们先来看一个简单的例子: void remodel(std::string & str) { std::string * ps = new std::string(str); ... if (weird_thing()) throw exception(); str = *ps; delete ps; return; } 当出现异常时(weird_thing()返回true),delete将不被执行,因此将导致内存泄露. 如何避免这种问题?有人会说,这还不简单,直

C++智能指针及其简单实现

本将主要介绍智能指针shared_ptr和unique_ptr,并简单实现基于引用计数的智能指针. 自C++11起,C++标准提供两大类型的智能指针: 1. Class shared_ptr实现共享式拥有(shared ownership)概念.多个智能指针可以指向相同对象,该对象和其相关资源会在“最后一个引用(reference)被销毁”时候释放.为了在结构复杂的情境中执行上述工作,标准库提供了weak_ptr.bad_weak_ptr和enable_shared_from_this等辅助类.

C++ 几种智能指针的简单实现

#pragma once // 智能指针 // 定义个类来封装资源的分配和释放,在构造 函数完成资源的分配和初始化,在析构函数完成资源的 // 清理,可以 保证资源的正确初始化和释放. // 这里简单实现 AutoPtr. ScopedPtr.ScopedArray以及 SharedPtr //------------------------------SmartPtr.h------------------- template<typename T> class AutoPtr //缺点 定

智能指针的简单实现

智能指针:动态的管理开辟的内存,防止人为的内存泄漏. SharedPtr的实现: 原理:使用引用计数的原理使多个对象可以指向一块空间. #define  _CRT_SECURE_NO_WARNINGS #include<iostream> using namespace std; template <class T> class SharedPtr { public: SharedPtr() :_count(new int(1)), _ptr(NULL) {} SharedPtr(

智能指针的原理和简单实现

什么是智能指针? 智能指针实质上是一个类,定义一个类来封装资源的分配和释放.这个类的构造函数中传入一个指针,完成资源的分配和初始化.在析构函数中释放传入的该指针,完成资源的释放. 为什么要用智能指针? 智能指针就是智能,自动化的管理指针所指向的动态资源. 例如以下情况:代码中经常会忘记释放动态开辟的内存资源,导致内存泄露. // case1 void Test2() {  int* p1 = new int(2);  bool isEnd = true;  //...  if (isEnd)  

智能指针浅析(转)

智能指针和普通指针的区别在于智能指针实际上是对普通指针加了一层封装机制,这样的一层封装机制的目的是为了使得智能指针可以方便的管理一个对象的生 命期.智能指针内部有一个计数器,记录了当前内存资源到底有多少指针在引用(可以访问这个资源),当新增加一个可以访问这个资源的引用时,计数器会加 1,反之会减去1,当计数器为0时,智能指针会自动释放他所管理的资源.手动申请,自动释放,方便内存管理,防止内存泄漏. 智能指针的简单实现: 每次创建类的新对象时,初始化指针并将引用计数置为1: 当对象作为另一对象的副

C++primer第十二章读书笔记---动态内存与智能指针

    目前为止我们使用过的静态内存,栈内存和内存池,静态内存用来保存局部static对象.类static成员,以及定义在任何函数之外的成员.栈内存用来保存定义在函数内部的非static成员,分配在静态 内存或栈内存中的对象由编译器自动创建或销毁,对于栈对象仅在其定义的程序块运行时才有效,static对象在程序运行之前分配,程序结束时销毁.除了静态内存和栈内存外,每个程序还拥有一个内存池(堆)在堆上分配动态对象,当动态对象不再使用时,我们必须显示的销毁它.     (一).动态内存与智能指针  

C/C++——跟我重写智能指针auto_ptr模版类

第一次使用auto_ptr的时候感觉很好用,但是对内部原理根本不懂,心里不知道这东西到底是个什么东东,总是感觉这东东比较陌生.今天有时间来简单实现一下该类模版auto_ptr,实现了该模版类的主要功能,可以让大家了解一下这个东东内部到底是个什么情况. 栈对象和堆对象的区别: 首先,看一下两种类对象的区别,一个是在栈上分配空间,另一个是在堆上分配空间. 如果看到这里,你不清楚堆和栈的区别.那我也不解释了,自行Google..(如果你想baidu也不拦你) 1.先测试栈上分配的对象 #include