zoukankan      html  css  js  c++  java
  • c++ smart pointer 趣谈

    上班的时候同事问起我一段项目中的旧代码,大致如下

    void foobar()
    {
        // some code here
        char* buffer = new char[length];
        std::auto_ptr<char> useless(buffer);
        // more code using 'buffer' here   
    }
    

    这段代码这样写的目的是:

    • buffer在超出scope(这里是函数foobar)时会自动释放,防止内存泄露,因为在后面的代码中有可能会提早返回或者抛出异常。
    • 后面在使用buffer的时候可以当成普通指针一样使用,避免了调用auto_ptr.get函数,只要不手动delete它

    然后又给他讲了一些C++其他智能指针的用法,在给他解释的过程中,发现可以用一种有趣的方式来解释,即比喻。

    我们将智能指针比作一个个性格迥异的人,智能指针里面的原始指针比作藏宝图,而原始指针指向的资源(内存,句柄,COM对象等等)比作宝藏。

    scoped_ptr(from boost)

    scoped_ptr是一个极度自私的人,自个独享藏宝图,不懂得怎么去分享或者传给后人,自己死了之后就会把宝藏毁掉,不想落入他人之手。

    unique_ptr

    unique_ptr稍微好点,他在自己死之前会把藏宝图传给自己的继承人,然后就这样代代相传。

    auto_ptr

    auto_ptr虽然看起来像是复印一份藏宝图给继承人,但是私底下干的却是传递的勾当,即不复印,只传递,传递之后自己就没有藏宝图了。

    shared_ptr

    唯一懂得共享宝藏的人就数shared_ptr了,多个shared_ptr共享宝藏,没有任何一个拥有绝对的所有权。而每一个shared_ptr都知道除了自己之外还有多少个shared_ptr共享这份宝藏。所以当一个shared_ptr死了之后,其他人都知道。那如果死的是共享宝藏的最后一个人,他才会把宝藏毁掉。

    而在C++的世界中,需要各种性格的人,各有各的用处,哪怕是自私的人。所以像scoped_ptr这样的人也还算受欢迎,大家有时候就喜欢他的这份自私的品质。

    但是表里不一的人在C++是不受欢迎的。曾经还没有unique_ptr的时候,大家还觉得auto_ptr很有用。自从unique_ptr诞生后,由于auto_ptr和unique_ptr都差不多,但是由于他说一套做一套,于是大家都建议不要去招惹他。

    当然,我们不要忘了给好好先生shared_ptr发张好人卡。

    暂时写到这里吧,估计知道各种智能指针的人都不知道我在讲些什么。

  • 相关阅读:
    在ensp上配置Trunk接口
    在ensp上VLAN基础配置以及Access接口
    在ensp上的ARP及Proxy ARP
    在ensp上简单的配置交换机
    1000000 / 60S 的 RocketMQ 不停机,扩容,平滑升级!
    DE1-SOC 只要加载驱动VNC就断开(DE1-SOC 只要加载驱动串口就卡住)
    通过U盘拷贝文件到DE1-SOC 的 Linux系统
    Linux 系统响应来自 FPGA 端的中断的中断号到底怎么对应?(GIC控制器)
    HPS 访问 FPGA 方法之五—— 通过FPGA 中断访问
    HPS 访问 FPGA 方法之四—— 编写 Linux 字符设备驱动
  • 原文地址:https://www.cnblogs.com/jianqifeihong/p/3520042.html
Copyright © 2011-2022 走看看