zoukankan      html  css  js  c++  java
  • C++ 智能指针一

    /* 智能指针shared_ptr */
    
    #include <iostream>
    #include <string>
    #include <memory>           //智能指针头文件
    
    /*
        shared_ptr 是一个标准的共享所有权的智能指针, 允许多个指针指向同一个对象. 定义在 memory 文件中(非memory.h), 命名空间为 std.
    智能指针并非指针,实际上智能指针是一个对象,有构造函数和析构函数的
    
        shared_ptr 是为了解决 auto_ptr 在对象所有权上的局限性(auto_ptr 是独占的), 在使用引用计数的机制上提供了可以共享所有权的智能指针,
    当然这需要额外的开销:
    (1) shared_ptr 对象除了包括一个所拥有对象的指针外, 还必须包括一个引用计数代理对象的指针.
    (2) 时间上的开销主要在初始化和拷贝操作上, *和->操作符重载的开销跟auto_ptr是一样.
    (3) 开销并不是我们不使用shared_ptr的理由, 永远不要进行不成熟的优化, 直到性能分析器告诉你这一点.
    */
    
    /*
    shared_ptr初始化:
    方式一:模板函数 make_shared 创建对象
         make_shared 需指定类型('<>'中)及参数('()'内), 传递的参数必须与指定的类型的构造函数匹配
    
    方式二:使用shared_ptr构造函数初始化
    
    方式三:使用成员方法reset初始化
    
    */
    
    /*
    shared_ptr成员函数
    use_count 返回引用计数的个数
    
    unique 返回是否是独占所有权( use_count 为 1)
    
    swap 交换两个 shared_ptr 对象(即交换所拥有的对象)
    
    reset 包含两个操作。当智能指针中有值的时候,调用reset()会使引用计数减1.当调用reset(new xxx())重新赋值时,
    智能指针首先是生成新对象,然后将就对象的引用计数减1(当然,如果发现引用计数为0时,则析构旧对象),然后将新对象的指针交给智能指针保管。 get 返回内部对象(指针), 由于已经重载了()方法, 因此和直接使用对象是一样的.如 shared_ptr<int> sp(new int(1)); sp 与 sp.get()是等价的 例如 std::shared_ptr<int> p4(new int(5)); int *pInt = p4.get();
    */ class Student { public: Student(std::string name_, int age_) :name(name_), age(age_) {} public: std::string name; int age; }; void test() { //创建一个shared_ptr对象 //方式一:模板函数 make_shared 创建对象 std::shared_ptr<Student> sp1 = std::make_shared<Student>("tom", 11); //方式二:使用shared_ptr构造函数初始化 std::shared_ptr<Student> sp2(new Student("jack", 12)); //方式三:使用成员方法reset初始化 std::shared_ptr<Student> sp3; sp3.reset(new Student("li", 13)); //注意,不能将一个原始指针直接赋值给一个智能指针,如下所示,原因是一个是类,一个是指针。 //std::shared_ptr<Student> sp4 = new Student("jack", 12); error //调用对象的成员 printf("--name [%s] ", sp3->name.c_str()); sp3.reset();//Student(li)计算器减一 printf("sp3.use_count = %d ", sp3.use_count()); } int main() { test(); getchar(); return 0; }
  • 相关阅读:
    将深度学习低延迟推理性能提高一倍
    常量特征
    数据库链接笔记
    html5页面调用手机打电话功能
    插件使用一表单验证一validation
    插件使用一树形插件---zTree一zTree异步加载
    插件使用一树形插件---zTree
    插件使用一进度条---nprogress
    插件使用一颜色选择器---cxColor
    插件使用一顶部消息提示---overhang
  • 原文地址:https://www.cnblogs.com/zhanggaofeng/p/10294483.html
Copyright © 2011-2022 走看看