C++11 shared_ptr与unique_ptr练习

// 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;
}

猜你喜欢

转载自blog.csdn.net/Lasuerte/article/details/82258025