1 智能指针的创建

1.1 传统方式

unique_ptr<Data> ptr1(new Data);

1.2 C++14及以上推荐使用

auto ptr2 = make_unique<Data>();

1.2.1 make_unique 的优势

  • 生成更小更快的代码
  • 避免重复类型声明
  • 提供内存安全保证

2 智能指针访问对象成员

class Data
{
public:
    Data() { cout << "create data\n"; }
    ~Data() { cout << "drop data\n"; }
    void Print() { cout << "print data\n"; }
};

2.1 指针方式访问

ptr2->Print();  

2.2 对象方式访问

 (*ptr2).Print();

3 获取原始指针

使用 get() 方法获取但不释放所有权
auto ptr2_ptr = ptr2.get();
ptr2_ptr->Print();

4 重置智能指针

auto ptr3 = make_unique<Data>();
ptr3.reset(new Data);    // 清除原有对象,管理新对象
ptr3.reset(nullptr);     // 显式释放对象

5 释放所有权

返回原始指针,智能指针变为空

auto ptr4 = make_unique<Data>();
auto ptr4_ptr = ptr4.release(); // 需要手动管理释放

6 移动语义转移所有权

auto ptr5 = make_unique<Data>();
unique_ptr<Data> ptr6 = move(ptr5); // ptr5 变为空

7 代码

#include<iostream>
#include<memory>
using namespace std;
class Data
{
public:
	Data() { cout << "create data\n"; }
	~Data() { cout << "drop data\n"; }
	void Print() { cout << "print data\n"; }
};

int main()
{
	{
		//创建智能指针
		unique_ptr<Data> ptr1(new Data);
		//c++14 支持,尽量用make unique
		//1 编译器产生更小更快的代码
		//2 减少重复类型设置
		//3 内存安全
		auto ptr2 = make_unique<Data>();
		ptr2->Print();//指针的方式
		(*ptr2).Print();//对象的方式
		auto ptr2_ptr = ptr2.get();
		ptr2_ptr->Print();

		//智能指针修改
		auto ptr3 = make_unique<Data>();
		ptr3.reset(new Data);//清除原有空间
		ptr3.reset(nullptr);//释放空间
		auto ptr4 = make_unique<Data>();
		//释放控制权
		auto ptr4_ptr = ptr4.release();
		//智能指针移动
		auto ptr5 = make_unique<Data>();
		unique_ptr<Data> ptr6 = move(ptr5);

		cout << "------------------------" << endl;
	}
	system("pause");

}

更多推荐