C++工程实战入门笔记16-智能指针
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");}