智能指针 .get() 正确 / 错误代码对照表(企业级终极版)
2026/6/5 7:41:31 网站建设 项目流程

智能指针.get()正确 / 错误代码对照表(企业级终极版)

我给你做最清晰、最实用、背完永不踩坑的对照表,直接复制到你的代码手册里!

一、正确用法 ✅(放心用)

1. 传给接收裸指针的函数(最常用)

cpp

运行

// 函数 void show(DeviceModel* ptr); // 调用 ✅ 正确 QSharedPointer<DeviceModel> sp(new DeviceModel); show(sp.get());

2. 调用 C 语言 / 旧接口

cpp

运行

// C 接口 void old_c_api(DeviceModel* ptr); // 调用 ✅ 正确 old_c_api(sp.get());

3. 只是读取、使用对象

cpp

运行

// 内部只是使用,不管理内存 ✅ 正确 void use(DeviceModel* ptr) { if (ptr) ptr->show(); } use(sp.get());

二、错误用法 ❌(必崩溃 / 必泄漏)

1. 用.get()再构造一个智能指针(致命错误)

cpp

运行

// ❌ 崩溃:双重释放! QSharedPointer<DeviceModel> sp2(sp.get());

2.delete.get()拿到的指针

cpp

运行

// ❌ 崩溃:智能指针还会再删一次 delete sp.get();

3. 把栈对象地址给智能指针,再调用.get()

cpp

运行

DeviceModel obj; QSharedPointer<DeviceModel> sp(&obj); sp.get(); // ❌ 崩溃

4. 长期保存.get()指针(野指针)

cpp

运行

// 全局变量保存裸指针 ❌ 危险! DeviceModel* m_ptr; void save(DeviceModel* p) { m_ptr = p; } // 外面智能指针释放后,m_ptr 变成野指针 save(sp.get());

5. 一个裸指针,给多个智能指针.reset()

cpp

运行

DeviceModel* raw = new DeviceModel; sp1.reset(raw); sp2.reset(raw); // ❌ 崩溃:两个智能指针管理同一块内存

三、终极 3 条黄金规则(背会)

规则 1:

.get()只用来 “借” 指针给别人用,不转移所有权

规则 2:

谁都不能用.get()的结果去 delete 或构造新智能指针

规则 3:

释放只看智能指针本身,.get()不影响释放、不影响计数


四、一句话口诀(最好记)

**get 拿指针,只借不拥有;

可读可写用,千万别删除;

不包新指针,不长时间存!**

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询