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++編程中不可或缺的工具。