zoukankan      html  css  js  c++  java
  • C++ 最简单的 '智能指针' 的实现

    在C++中使用 new 堆中申请了一块内存,在你使用完成后要“记得” 去释放它(delete),不然这块内存就浪费掉了。

    但是让所在程序员都”记得“ 这件事儿本身就不靠谱。 特别是在程序变得很大之后。 没有人会记得所有你需要释放的内存。

    这时候 就想如果能像 C#那样。程序自己去管理内存就太爽了。很大程度的给程序员减负呀~~~~

    在C++ memory.h 中就有一个这种类的实现  auto_ptr. 

    先说下它的原理, 很简单。 就是用栈中的变量去释放堆中的内存,因为 栈中的变量是在不需要的时候自动释放掉的。 这样我们就可以

    在这个变量的析构函数中去 delete  掉这块内存了。

    比如 : 这样一个简单的类

     1 class Person
     2 
     3 {
     4    private:
     5      string _name;
     6      int _age;
     7          public:
     8              Person(string name,int age) {
     9                   this->_name = name;
    10                   this->_age = age;
    11              }      
    12          void Print() {
    13                cout << "Name : " << _name << " age : " << _age << endl;
    14          }
    15 };    

    在栈中创建的话是这样 : Person per("Hello world",45);  

    在堆中是这样的使用 New : Person* per = new Person("Hello world",45); 这时 per 是一个指针

    Ok。。 这面我们来 用最简单的代码去实现一下。可以自动释放内存的类

     1 #include <iostream>
     2 #include <string>
     3 
     4 template<class T>
     5 class auto_ptr
     6 {
     7 private:
     8     T* _ptr;
     9 public:
    10     // 构造函数,传入一指针
    11     auto_ptr(T* ptr){
    12         _ptr = ptr;
    13     }
    14 
    15     // 析构函数,清除内存
    16     ~auto_ptr(){
    17         if (_ptr != NULL)
    18         {
    19             delete _ptr;
    20             _ptr = NULL;
    21         }
    22     }
    23 
    24     // 重写 -> 操作符
    25     T* operator -> () {
    26         return _ptr;
    27     }
    28 };
    29 
    30 #endif

    这个类中 有一个 私有的 T* _ptr . 这样就可以接受任意类型的指针了。   并在构造函数中, 但一个 指针赋给这个变量。  主要部分就是在它的 析构函数中,去delete 掉 _ptr 所指向的那块内存。

    还有你需要重载 -> 这个运算符。 这样才能像使用指针那样。使用这个类了。

    下面就是如何使用这个类:

    int main(){
        // 这一句的意思是,在栈中申请一个变量 auto_ptr<Person> per
            // 它是在栈中的,所以可以自动被释放
            // 这个 ‘=‘ 号就是调用了, auto_ptr 的构造函数,将
            // new Person("Hello World",45),所传回的指针,赋给 auto_ptr 里面的 _ptr 变量
        auto_ptr<Person> per = new Person("ZhouTianChi",30);
            
            // 这里就使用了我们auto_ptr 中的重截的 -> 运算符
            // 其实就是 auto_ptr 里面的 _ptr->print();
        per->Print();
    
        return 0;
    }
  • 相关阅读:
    Python的subprocess子进程和管道进行交互
    python UnicodeEncodeError: 'ascii' codec can't encode characters 解决办法
    如何创建,增加swap
    nginx.conf配置
    15个极好的Linux find命令示例(二)
    15个实用的Linux find命令示例(一)
    vmware 虚拟机 mount :no medium found解决方法
    服务器上的iptables
    源码编译安装MySQL
    ORACLE参数文件
  • 原文地址:https://www.cnblogs.com/easyfrog/p/2837154.html
Copyright © 2011-2022 走看看