1. 智能指针的本质与演进历程
我第一次接触智能指针是在2013年参与一个跨平台C++项目时。当时项目组要求彻底禁用裸指针,所有动态内存必须通过智能指针管理。这个看似严苛的规定,后来让我深刻理解了智能指针的价值——它不仅是语法糖,更是C++资源管理的范式革命。
C++98标准首次引入auto_ptr,这个设计存在致命缺陷:所有权转移的隐式性会导致原指针意外失效。我在早期项目中就遇到过这样的bug:
cpp复制auto_ptr<int> p1(new int(10));
auto_ptr<int> p2 = p1; // 所有权转移
*p1 = 20; // 运行时崩溃!
C++11带来了三种现代智能指针:
- unique_ptr:独占所有权,支持移动语义
- shared_ptr:引用计数共享所有权
- weak_ptr:解决shared_ptr循环引用问题
2. unique_ptr的独占式管理实践
2.1 基本用法与性能优势
unique_ptr是auto_ptr的替代品,通过编译期检查确保所有权唯一。我在高频交易系统中实测发现,与shared_ptr相比,unique_ptr的内存开销几乎为零:
cpp复制// 工厂模式典型用法
unique_ptr<Connection> create_connection() {
return unique_ptr<Connection>(new SecureConnection());
}
// 自定义删除器示例
struct FileDeleter {
void operator()(FILE* fp) const {
if(fp) fclose(fp);
}
};
unique_ptr<FILE, FileDeleter> logfile(fopen("debug.log", "w"));
2.2 移动语义的妙用
unique_ptr不可复制但支持移动,这个特性在容器操作中尤为实用:
cpp复制vector<unique_ptr<Worker>> workers;
workers.push_back(unique_ptr<Worker>(new Worker())); // 需要移动语义
// 错误
