C++基础::shared_ptr 编程细节(一)

原创 2015年11月18日 17:57:52

C++基础::shared_ptr 编程细节(一)

C++基础::shared_ptr 编程细节(二)

C++基础::shared_ptr 编程细节(三)

智能指针是c++ 中管理资源的一种方式,用智能指针管理资源,不必担心资源泄露,将 c++ 程序员从指针和内存管理中解脱出来。

shared_ptr 的两面性

  • shared_ptr 型智能指针对象的本质是类实例;

    所以允许.+成员函数的调用方式(这里的成员函数是 shared_ptr 作为类实例所具有的成员函数),比如一个shared_ptr最为类实例的成员函数:

    • .use_count()
    • .get()
    • .reset()
    • .unique()
  • 含义上作为智能指针的一面

    所以允许->成员函数的调用方式(这里的成员函数为智能指针所维护的真实对象所具有的成员函数)。

shared_ptr 的副作用

shared_ptr:一种智能指针,本意封装原生指针(new 出来的堆对象),实现指针的类型安全,然而,见名知意,它是共享型指针,即允许多个shared_ptr“指向”同一个对象,当我们在某些情况下不需要这一看似美好的性质时,该如何处理呢。

class Item
{
private:
    std::string _name;
    float _price;
public:
    Item(const std::string& name, float price):_name(name), 
                            _price(price){}
    float getPrice() const { return _price;}
    void setPrice(float price) { _price = price;}
    Item* clone() const { return new Item(*this);} 
};

// 单纯为了演示的需要,并无实际的意义
class A
{
public:
    A(const std::shared_ptr<Item>& obj):_obj(obj){}
    const std::shared_ptr<Item>& get() const
    { return _obj;}
private:
    std::shared_ptr<Item> _obj;
};

int main(int, char**)
{
    std::shared_ptr<Item> item1(new Item("C++", 20.));
    A a(item1);
    // 此时查看item1的引用次数:
    std::cout << item1.use_count() << std::endl;
                            // 2
    // 如果使用对象a对内部的_obj进行修改,会同步到item1中
    a.get()->setPrice(30.);
    std::cout << item1->getPrice() << std::endl;

    // 这时我们创建另外一个A对象
    A b(a);
    // 这时如果不对A的拷贝构造进行重载的话,b也会持有一份对item1对象的引用
    std::cout << item1.use_count() << std::endl;
                            // 3
    return 0;
}

这就是shared_ptr共享型智能指针的便捷和局限。那么,我们该如何使用拷贝构造时,建立自己独特的副本呢?

我们需要显式地给出A的拷贝构造,避免编译器对拷贝构造的默认实现:

class A
{
...
public:
    A(const A& other)
    {
        _obj = std::shared_ptr<Item>(other.get()->clone());
    } 
}

所以结论是,在一个需被 shared_ptr 封装的类内部给出非常关键 clone() 函数的实现非常关键

    Obj* clone() const { return new Obj(*this); }

以 shared_ptr 类类型为容器类型的容器之间的赋值

是继续持有对象的引用,还是一份全新的拷贝;


std::shared_ptr<Item> item1(new Item("C++", 20.5));
std::shared_ptr<Item> item2(new Item("Python", 25.5));

std::vector<std::shared_ptr<Item>> v1 = {item1, item2};
std::vector<std::shared_ptr<Item>> v2 = v1;
                            // 继续持有引用
std::cout << item1.use_count() << std::endl;
                            // 3
item1->setPrice(30.);
std::cout << v2[0]->getPrice() << std::endl;

std::vector<std::shared_ptr<Item>> v3;
for (size_t i = 0; i < v1.size(); ++i)
    v3.push_back(std::shared_ptr<Item>(v1[i]->clone()));
                            // 一份全新的拷贝
item2->setPrice(35.5);
std::cout << v3[1]->getPrice() << std::endl;
                            // 25.5
版权声明:本文为博主原创文章,未经博主允许不得转载。

Spark修炼之道(基础篇)——Linux大数据开发基础:第十一节:Shell编程入门(三)

本节主要内容 shell数组 shell命令别名 时间操作 1. Shell数组同C、C++等语言一样,shell脚本也提供了数组这样一个重要的数据结构,shell中的数组有两种,一种为普通数组,另外...
  • lovehuangjiaju
  • lovehuangjiaju
  • 2015年10月05日 15:34
  • 3454

C/C++ 网络编程3: 套接字基础

部分信息参考 信息安全实验 信息安全实验四实验参考 参考 信息安全实验资料 四个PPT文件 server.c 套接字地址 Linux系统的套接字可以支持多种协议,每种不同的协...
  • u014015972
  • u014015972
  • 2016年06月16日 16:25
  • 5364

NOI题解(1.6编程基础之一维数组)(补全)

01:与指定数字相同的数的个数 #include "iostream" using namespace std; int main() { int count; int time=0;...
  • v_xchen_v
  • v_xchen_v
  • 2016年09月07日 19:00
  • 1911

C++基础::shared_ptr 编程细节(二)

*sp 与 sp.get() 三种初始化的方法 operator ==(shared_ptr对象的相等性比较)
  • lanchunhui
  • lanchunhui
  • 2016年02月23日 17:15
  • 518

C++细节学习之智能指针auto_ptr和tr1::shared_ptr

为什么要用智能指针? 我们知道在C++中,资源管理是个头疼的问题。资源管理最常做的就是内存管理。而指针用起来如果忘记归还,就会导致内存泄露。 比如:class Oneclass{}; int fu...
  • u010818535
  • u010818535
  • 2015年06月01日 21:34
  • 496

C++ 智能指针(shared_ptr/weak_ptr)源码

  • 2016年06月10日 19:46
  • 32KB
  • 下载

C++ - "shared_ptr"的使用方法 及 代码

"shared_ptr"的使用方法 及 代码   智能指针(smart pointer)是C++11的新特性. 指针在无人使用时, 自动释放动态内存. 通过"use_count"计数, 并判断是否无人...
  • u012515223
  • u012515223
  • 2013年11月04日 09:45
  • 2801

C++ 智能指针shared_ptr模板实现原理

C++ 智能指针shared_ptr通过引用计数来管理指向的对象,不需要人工释放 这篇博文主要是讲解了智能指针的实现原理,怎么实现引用计数 #include using namespace s...
  • szqsdq
  • szqsdq
  • 2017年05月07日 15:07
  • 327

effective c++条款13-17 “以对象管理资源”之shared_ptr浅析

顾名思义,boost::shared_ptr是可以共享所有权的智能指针,首先让我们通过一个例子看看它的基本用法: #include #include #include class imple...
  • hustyangju
  • hustyangju
  • 2014年12月01日 15:48
  • 674

C/C++ 日常学习总结(第二十一篇)智能指针shared_ptr

最近看到项目中很多封装的 1.auto_ptr
  • wu_123_456
  • wu_123_456
  • 2014年09月19日 16:05
  • 1118
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++基础::shared_ptr 编程细节(一)
举报原因:
原因补充:

(最多只允许输入30个字)