欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

C++11 shared_ptr与unique_ptr练习

程序员文章站 2024-02-29 09:38:16
...
// shared_ptr练习.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"

#include <memory>
#include <iostream>

void process(std::shared_ptr<int> sp)
{
    int n = sp.use_count();
    std::cout << "In Process ptr use_count:" << n << std::endl;
    *sp = 20;
}

void Process2(int* p)
{
    *p = 30;
}
///<-----------------------------------------
void testRefCount()
{
    std::cout << "测试传入参数的引用计数 \t————————————————————————" << std::endl;
    // sp创建时计数为1,传入process时,引用计数变为2,Process函数返回后计数恢复为1,形参指针被释放
    std::shared_ptr<int> sp = std::make_shared<int>(10);
    process(sp);

    int n = sp.use_count();
    std::cout << "After ptr use_count:" << n << std::endl;
}

void testParam()
{
    std::cout << "测试传入shared_ptr<T> \t————————————————————————" << std::endl;
    // 这样传进去的x,在process返回后,引用计数归零,所以x指向的内存释放掉了,x的值变成了未知值
    int* x = new int(50);
    process(std::shared_ptr<int>(x));

    int k = *x;
    std::cout << "Process 返回后的x值:" << k << std::endl;
}

void testPtr()
{
    std::cout << "测试传入普通指针 \t————————————————————————" << std::endl;
    std::shared_ptr<int> sp = std::make_shared<int>(10);
    Process2(sp.get());
    // 传入Process2后引用计数不会增加,注意不要用get初始化或赋值另一个智能指针
    // 且记住要在用完get的指针后再销毁智能指针,否则get指针未用完就被销毁了
    int k = *sp;
}

std::unique_ptr<int> clone(int p)
{
    // 函数返回unique_ptr
    p = 15;
    return std::unique_ptr<int>(new int(p));
}
std::unique_ptr<int> clone2(int p)
{
    std::unique_ptr<int> pRet = std::make_unique<int>(25);
    return pRet;
   
}
void testUniquePtr()
{
    std::unique_ptr<int> uq(new int(10));
    std::unique_ptr<int> uqm = std::make_unique<int>(20);
    // 不支持拷贝
    //uq(uqm);
    std::unique_ptr<int> uq2;
    // 不支持赋值
    //uq2 = uq;
    double x = 2.9;
    std::unique_ptr<int,double> uq3();

    int n = 0;
    // 令uq指向,指向n的指针,否则置空uq
    uq.reset(&n);
    // release返回指针,u放弃指针控制权,并置空
    int* q = nullptr;
    q = uq.release();
    n = *q;
    // 拷贝赋值例外,可以拷贝或赋值将要被销毁的unique_ptr
    uq2 = clone(n);
    uq2 = clone2(n);
    
}

int _tmain(int argc, _TCHAR* argv[])
{
    testRefCount();
    testParam();
    testPtr();
    testUniquePtr();
    system("pause");
	return 0;
}