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