[C++11]独占的智能指针unique_ptr的初始化和使用

Posted Wecccccccc

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[C++11]独占的智能指针unique_ptr的初始化和使用相关的知识,希望对你有一定的参考价值。

  1. std::unique_ptr
    是一个独占型的智能指针,它不允许其他的智能指针共享其内部的指针,可以通过它的构造函数初始化一个独占智能指针对象,但是不允许通过赋值将一个
    unique_ptr 赋值给另一个 unique_ptr。
  2. std::unique_ptr 不允许复制,但是可以通过函数返回给其他的 std::unique_ptr,还可以通过 std::move
    来转译给其他的 std::unique_ptr,这样原始指针的所有权就被转移了,这个原始指针还是被独占的。
  3. 使用 reset 方法可以让 unique_ptr 解除对原始内存的管理,也可以用来初始化一个独占的智能指针。
  • ptr1.reset(); 解除对原始内存的管理
  • ptr2.reset(new int(250)); 重新指定智能指针管理的原始内存

代码如下:

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

class Test
{
public:
	Test()
	{
		cout << "construct" << endl;
	}
	Test(int x) :m_num(x)
	{
		cout << "construct x = " << x << endl;
	}
	Test(string str)
	{
		cout << "construct str = " << str << endl;
	}

	~Test()
	{
		cout << "destruct" << endl;
	}

	void setValue(int v)
	{
		m_num = v;
	}

	void print()
	{
		cout << "m_num = " << m_num << endl;
	}

private:
	int m_num;
};


int main()
{
	//通过构造函数初始化
	unique_ptr<int>ptr1(new int(9));
	//unique_ptr<int>ptr2 = ptr1; error

	//通过移动构造函数初始化
	unique_ptr<int>ptr2 = move(ptr1);

	//通过reset初始化
	ptr2.reset(new int (8));

	//获取原始指针
	unique_ptr<Test> ptr3(new Test(1));
	Test*pt = ptr3.get();
	pt->setValue(2);
	pt->print();

	ptr3->setValue(4);
	ptr3->print();
	return 0;

}

测试结果:

在这里插入图片描述

以上是关于[C++11]独占的智能指针unique_ptr的初始化和使用的主要内容,如果未能解决你的问题,请参考以下文章

unique_ptr的实现原理

第20课 unique_ptr独占型智能指针

C/C++知识要点5——智能指针原理及自己定义实现

C++11 unique_ptr智能指针详解

智能指针unique_ptr用法

智能指针用法