ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

8、shared_ptr

2021-08-14 13:35:38  阅读:132  来源: 互联网

标签:cout int ptr1 shared include ptr


  共享智能指针是指多个智能指针可以同时管理同一块有效的内存,共享智能指针 shared_ptr 是一个模板类

一、shared_ptr 的初始化

  (1)通过构造函数

std::shared_ptr<T> 智能指针名字(创建堆内存);
#include "stdafx.h"

#include <iostream>
#include <windows.h>
#include <functional>
#include <memory>

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
    //使用智能指针管理一块int型内存
    shared_ptr<int> ptr1(new int(520));
    cout << "ptr1管理的内存引用计数:" << ptr1.use_count() << endl;
    //使用智能指针管理一块字符数组对应的堆内存
    shared_ptr<char> ptr2(new char[10]);
    cout << "ptr2管理的内存引用计数:" << ptr2.use_count() << endl;
    //创建智能指针对象,不管理任何内存
    shared_ptr<int> ptr3;
    cout << "ptr3管理的内存引用计数:" << ptr3.use_count() << endl;
    shared_ptr<int> ptr4(nullptr);
    cout << "ptr4管理的内存引用计数:" << ptr4.use_count() << endl;

    system("pause");
    return 0;
}

注意:

  如果智能指针被初始化了一块有效内存,那么这块内存的引用计数 + 1,如果智能指针没有被初始化或者被初始化为 nullptr 空指针,引用计数不会 + 1。另外,不要使用一个原始指针初始化多个 shared_ptr。

  (2)通过拷贝和移动构造函数初始化

#include "stdafx.h"
#include <iostream>
#include <windows.h>
#include <memory>

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
    shared_ptr<int> ptr1(new int(520));

    //调用拷贝构造函数
    shared_ptr<int> ptr2(ptr1);
    
    //调用移动构造函数
    shared_ptr<int>    ptr3(std::move(ptr1));

    system("pause");
    return 0;
}

  (3)std::make_shared辅助函数

    通过 C++ 提供的 std::make_shared() 就可以完成内存对象的创建并将其初始化给智能指针,函数原型如下:

template< class T, class... Args >
shared_ptr<T> make_shared( Args&&... args );
#include "stdafx.h"
#include <iostream>
#include <windows.h>
#include <memory>

using namespace std;

class Test
{
public:
    Test()
    {
        cout << "construct Test..." << endl;
    }
    Test(int x)
    {
        cout << "construct Test, x = " << x << endl;
    }
    Test(string str)
    {
        cout << "construct Test, str = " << str << endl;
    }
    ~Test()
    {
        cout << "destruct Test ..." << endl;
    }
};

int _tmain(int argc, _TCHAR* argv[])
{
    shared_ptr<int> ptr1 = make_shared<int>(520);
    cout << "ptr1管理的内存引用计数: " << ptr1.use_count() << endl;

    shared_ptr<Test> ptr2 = make_shared<Test>();
    cout << "ptr2管理的内存引用计数: " << ptr2.use_count() << endl;

    shared_ptr<Test> ptr3 = make_shared<Test>(520);
    cout << "ptr3管理的内存引用计数: " << ptr3.use_count() << endl;

    shared_ptr<Test> ptr4 = make_shared<Test>("我是要成为海贼王的男人!!!");
    cout << "ptr4管理的内存引用计数: " << ptr4.use_count() << endl;


    system("pause");
    return 0;
}

 

    (4)通过 reset 方法初始化

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

int main()
{
    // 使用智能指针管理一块 int 型的堆内存, 内部引用计数为 1
    shared_ptr<int> ptr1 = make_shared<int>(520);
    shared_ptr<int> ptr2 = ptr1;
    shared_ptr<int> ptr3 = ptr1;
    shared_ptr<int> ptr4 = ptr1;
    cout << "ptr1管理的内存引用计数: " << ptr1.use_count() << endl;
    cout << "ptr2管理的内存引用计数: " << ptr2.use_count() << endl;
    cout << "ptr3管理的内存引用计数: " << ptr3.use_count() << endl;
    cout << "ptr4管理的内存引用计数: " << ptr4.use_count() << endl;

    ptr4.reset();
    cout << "ptr1管理的内存引用计数: " << ptr1.use_count() << endl;
    cout << "ptr2管理的内存引用计数: " << ptr2.use_count() << endl;
    cout << "ptr3管理的内存引用计数: " << ptr3.use_count() << endl;
    cout << "ptr4管理的内存引用计数: " << ptr4.use_count() << endl;

    shared_ptr<int> ptr5;
    ptr5.reset(new int(250));
    cout << "ptr5管理的内存引用计数: " << ptr5.use_count() << endl;

    return 0;
}

二、获取原始指针

#include "stdafx.h"
#include <iostream>
#include <windows.h>
#include <memory>

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
    int len = 128;
    shared_ptr<char> ptr(new char[len]);
    //得到指针的原始地址
    char* addr = ptr.get();
    memset(addr, 0, len);
    strcpy_s(addr, len, "fasfwefew");
    cout << "string :" << addr << endl;

    shared_ptr<int> ptr1(new int);
    *ptr1 = 100;
    cout << *ptr1.get() << " " << *ptr1 << endl;


    system("pause");
    return 0;
}

 

标签:cout,int,ptr1,shared,include,ptr
来源: https://www.cnblogs.com/zwj-199306231519/p/15140634.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有