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");
}
更多推荐



所有评论(0)