在 C++ 中,智能指針是一種對象,它允許對原始指針進行更安全和更方便的操作。智能指針可以自動管理指向的對象的生命周期,從而避免內存泄漏。以下是幾種常見的 C++ 智能指針:
std::unique_ptr 是一種獨占所有權的智能指針。它保證同一時間只有一個智能指針可以指向一個對象。當 std::unique_ptr 超出作用域或被顯式刪除時,它所指向的對象也會被自動刪除。
示例:
#include <iostream>
#include <memory>
struct Foo {
Foo() { std::cout << "Foo::Foo\n"; }
~Foo() { std::cout << "Foo::~Foo\n"; }
};
void func(std::unique_ptr<Foo> ptr) {
// ptr 在這里擁有 Foo 對象的所有權
}
int main() {
std::unique_ptr<Foo> ptr(new Foo); // 創建 Foo 對象,ptr 擁有其所有權
func(std::move(ptr)); // 將所有權轉移給 func 中的 unique_ptr
// ptr 現在為空,不再擁有 Foo 對象的所有權
return 0;
}
std::shared_ptr 是一種共享所有權的智能指針。多個 std::shared_ptr 可以指向同一個對象,并且該對象會在最后一個指向它的 std::shared_ptr 被銷毀或重置時自動刪除。
示例:
#include <iostream>
#include <memory>
struct Foo {
Foo() { std::cout << "Foo::Foo\n"; }
~Foo() { std::cout << "Foo::~Foo\n"; }
};
void func(std::shared_ptr<Foo> ptr) {
// ptr 在這里擁有 Foo 對象的所有權
}
int main() {
std::shared_ptr<Foo> ptr1(new Foo); // 創建 Foo 對象,ptr1 擁有其所有權
{
std::shared_ptr<Foo> ptr2 = ptr1; // ptr2 也擁有 Foo 對象的所有權
func(ptr2); // 將所有權轉移給 func 中的 shared_ptr
} // ptr2 超出作用域,Foo 對象不會被刪除
func(ptr1); // 將所有權轉移給 func 中的 shared_ptr
return 0;
}
通過使用智能指針,您可以避免手動管理內存,從而減少內存泄漏的風險。智能指針會在不再需要時自動釋放它們所指向的對象,從而確保內存得到正確的管理。