C++11引入了智能指针,它们是处理动态内存分配和避免内存泄漏的重要工具。智能指针的几种创新用法包括:
自定义删除器:智能指针允许用户指定一个删除器来释放资源,而不是默认的delete
操作符。这在管理非堆内存(如文件句柄或网络连接)时非常有用。
std::unique_ptr<FILE, decltype(&pclose)> filePtr(popen("command", "r"), pclose);
std::shared_ptr
的弱引用:std::weak_ptr
是为了配合std::shared_ptr
而设计的,它允许观察共享对象而不增加其引用计数。这可以防止循环引用导致的内存泄漏。
std::shared_ptr<MyClass> sharedPtr = std::make_shared<MyClass>();
std::weak_ptr<MyClass> weakPtr = sharedPtr;
if (auto lockedPtr = weakPtr.lock()) {
// 使用lockedPtr
} else {
// sharedPtr已经被销毁
}
std::shared_ptr
与std::enable_shared_from_this
:通过std::enable_shared_from_this
,对象可以在其内部创建自己的std::shared_ptr
副本,从而避免在多线程环境下的引用计数竞争。
class MyClass : public std::enable_shared_from_this<MyClass> {
public:
std::shared_ptr<MyClass> getSharedPtr() {
return shared_from_this();
}
};
std::unique_ptr
的移动语义:std::unique_ptr
支持移动语义,允许资源的所有权从一个智能指针转移到另一个,而不进行复制。
std::unique_ptr<int> ptr1 = std::make_unique<int>(42);
std::unique_ptr<int> ptr2 = std::move(ptr1); // 所有权转移到ptr2
std::unique_ptr
与自定义类型:std::unique_ptr
可以与自定义删除器一起使用,以支持管理非标准资源。
struct CustomDeleter {
void operator()(MyCustomType* ptr) const {
// 自定义释放资源逻辑
}
};
std::unique_ptr<MyCustomType, CustomDeleter> uptr(new MyCustomType(), CustomDeleter());
std::shared_ptr
的数组版本:虽然标准库中没有直接提供std::shared_ptr
的数组版本,但可以通过使用std::make_shared
和std::vector
来模拟。
auto vec = std::make_shared<std::vector<int>>(10);
std::shared_ptr
与std::atomic
:在多线程环境中,可以使用std::atomic<std::shared_ptr<T>>
来保证对共享指针的安全访问。
std::atomic<std::shared_ptr<MyClass>> atomicPtr;
这些创新用法展示了智能指针在C++中的强大功能和灵活性,它们是现代C++编程中不可或缺的工具。