SmartPtr

// smart pointer implements

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

template<typename T> class SharePtr;

template<typename T>
class ResPtr { // manage res of memory
private:
    T* res_p;    // point res
    int use_num; // count

    ResPtr(T *p) : res_p(p), use_num(1){
        cout << "the constructor of ResPtr\n";
    }
    ~ResPtr(){
        delete res_p;
        cout << "the destructor of ResPtr\n";
    }
    friend class SharePtr<T>;
};

template<typename T>
class SharePtr {
public:
    SharePtr(T *p, T i) : ptr(new ResPtr<T>(p)), val(i){
        cout << "the constructor of SharePtr and the use count is " << ptr->use_num << endl;;
    }

    SharePtr(const SharePtr& rhs) : ptr(rhs.ptr), val(rhs.val) {
        ++ptr->use_num;
        cout << "the copy constructor of SharePtr and the use of count is " << ptr->use_num << endl;
    }

    ~SharePtr() {
        cout << "the destructor of SharePtr and the use of count is " << ptr->use_num << endl;
        if(--ptr->use_num == 0){
            cout << "relese memory\n";
            delete ptr;
        }
    }

    T &operator*(){
        return *this->ptr->res_p;
    }
    T *operator->(){
        return this->ptr->res_p;
    }

private:
    ResPtr<T> *ptr; // point use_count
    T val;
};

// test code
int main() {

    {
        SharePtr<int> hpa = SharePtr<int>{ new int (42), 100 };
        {
            // copy three objects
            SharePtr<int> hpb{hpa};
            SharePtr<int> hpc{hpb};
            SharePtr<int> hpd{hpc};
        };
        cout << "inner end\n";
    }
    cout << "middle end\n";
    return 0;
}

  

原文地址:https://www.cnblogs.com/MasterYan576356467/p/12178486.html

时间: 2024-11-06 19:49:55

SmartPtr的相关文章

C++学习之模板应用 ---array、smartptr、stack

有array(数组).smartptr(智能指针).stack(栈): 一.array: 1.我们实现了指针访问和下标访问.C++中指针访问常用迭代器来代替. 2.这里我们也揭示了 size_type.iterator.[] .begin().end().size()的真实面目: Array.hpp 1 #ifndef ARRAY_H_ 2 #define ARRAY_H_ 3 //Arrar.hpp 4 #include <stddef.h> 5 template <typename

More Effective C++ 条款28 Smart Pointers(智能指针)

1. 智能指针(如标准库的auto_ptr,shared_ptr,weak_ptr,boost的scoped_ptr等)主要用于动态内存的管理,同时提供给用户与内置指针一样的使用方法,本条款主要涉及智能指针在构造与析构,复制和赋值,解引等方面的注意点,而非智能指针的实现细节. 2. 智能指针的构造,赋值,析构 智能指针的copy constructor,assignment operator,destructor对应于不同的观念而有不同的实现,主要有三种选择: 1).不允许对象的共享,在调用co

智能指针的实现--使用引用计数实现以及原理

一.智能指针 在C++语言编程时,当类中有指针成员时,一般有两种方式来管理指针成员:一是采用值型的方式管理,每个类对象都保留一份指针指向的对象的拷贝:另一种更优雅的方式是使用智能指针,从而实现指针指向的对象的共享. 智能指针(smart pointer)的一种通用实现技术是使用引用计数(reference count).智能指针类将一个计数器与类指向的对象相关联,引用计数跟踪该类有多少个对象共享同一指针. 每次创建类的新对象时,初始化指针并将引用计数置为1:当对象作为另一对象的副本而创建时,拷贝

C++——几种简单的智能指针

最简单的智能指针就是将指针封装在类里,同时将该类的复制与赋值禁用,也就是使该类失去值语义. 实现代码如下: 1 #ifndef SMART_PTR_H 2 #define SMART_PTR_H 3 #include <iostream> 4 5 6 template <typename T> 7 class SmartPtr 8 { 9 public: 10 typedef T value_type; 11 typedef T* pointer; 12 typedef T&

智能指针的模板,用来管理动态分配的内存

#ifndef SMARTPTR_HPP #define SMARTPTR_HPP #include <stddef.h> template <typename T> class SmartPtr{ public: SmartPtr(T *type = NULL); void resetPtr(T *type); const T *getPtr()const; operator bool() const{ return ptr_ == NULL; } ~SmartPtr(); T

垃圾回收器设计

1利用栈对象自动释放(可以禁止析构函数就不能产生栈对象了哦 小技巧) 利用栈对象出作用域自动释放的特性构造一个空的智能指针类 2解决智能释放问题,只要这样就不用手工delete类指针了 在智能指针类的析构函数里面delete对象成员去对象里面释放垃圾指针等.. 3解决被智能指针代理的真实对象的函数的调用问题 重载->运算符,以便能直接调用这个智能指针存储的对象中的函数 或者使用代理模式不过没有重载的方法简单 4继承引用计数类,来为自身增加引用技术功能, 引用计数的++ --在智能指针里完成 #i

C++异常处理 - try,catch,throw,finally的用法

写在前面 所谓异常处理,即让一个程序运行时遇到自己无法处理的错误时抛出一个异常,希望调用者可以发现处理问题. 异常处理的基本思想是简化程序的错误代码,为程序键壮性提供一个标准检测机制. 也许我们已经使用过异常,但是你习惯使用异常了吗? 现在很多软件都是n*365*24小时运行,软件的健壮性至关重要. 内容导读 本文包括2个大的异常实现概念:C++的标准异常和SHE异常. C++标准异常: 也许你很高兴看到错误之后的Heap/Stack中对象被释放,可是如果没有呢? 又或者试想一下一个能解决的错误

Effective C++ 条款45 运用成员函数模板接受所有兼容类型

1. "智能指针"是行为像指针的对象,但它们能提供指针没有的功能:shared_ptr,weak_ptr,auto_ptr(见条款13)实现对堆内存的自动管理,STL的迭代器实现对整个容器的遍历等. 真正的指针的优势在于支持继承层次中派生类指针向基类指针的转换(当然标准库shared_ptr,weak_ptr,auto_ptr等已实现). 2. 由于同一template的不同具现体之间没有直接联系,也就是说对于自定义的智能指针(假设名为SmartPtr),如果不额外采取手段支持基层层次

《Effective C++》:条款44-条款45

条款44将与参数无关的代码抽离templates 条款45运用成员函数模板接受所有兼容类型 Templates和泛型编程 条款44:将与参数无关的代码抽离templates Templates可以节省时间和避免代码重复.对于类似的classes或functions,可以写一个class template或function template,让编译器来做剩余的事.这样做,有时候会导致代码膨胀(code bloat):其二进制码带着重复(或几乎重复)的代码.数据,或者两者.但这时候源代码看起来可能很