智能指針是一種 C++ 對(duì)象,用于管理動(dòng)態(tài)分配的內(nèi)存資源。智能指針的一個(gè)主要目標(biāo)是確保在任何情況下,包括異常,都能正確釋放動(dòng)態(tài)分配的內(nèi)存,防止內(nèi)存泄漏。C++ 提供了幾種類型的智能指針,包括 unique_ptr、shared_ptr 和 weak_ptr。
下面是這些智能指針的基本使用方法:
1. **unique_ptr**
`unique_ptr` 代表對(duì)動(dòng)態(tài)分配對(duì)象的獨(dú)占所有權(quán)。當(dāng) `unique_ptr` 離開(kāi)作用域或被重置時(shí),它所擁有的對(duì)象也會(huì)被自動(dòng)刪除。
```cpp
std::unique_ptr<int> ptr(new int(10));
```
也可以使用 `std::make_unique` 創(chuàng)建 `unique_ptr`:
```cpp
std::unique_ptr<int> ptr = std::make_unique<int>(20);
```
unique_ptr` 不支持復(fù)制,但支持移動(dòng)。
2. **shared_ptr**
`shared_ptr` 是一個(gè)引用計(jì)數(shù)的智能指針,用于共享所有權(quán)的場(chǎng)景。當(dāng)最后一個(gè)引用被銷毀時(shí),`shared_ptr` 所管理的對(duì)象也會(huì)被自動(dòng)刪除。
```cpp
std::shared_ptr<int> ptr1(new int(10));
std::shared_ptr<int> ptr2 = ptr1; // ptr1 和 ptr2 共享同一個(gè)對(duì)象
```
`shared_ptr` 使用 `std::make_shared` 創(chuàng)建:
```cpp
std::shared_ptr<int> ptr = std::make_shared<int>(20);
```
3. **weak_ptr**
`weak_ptr` 是一個(gè)不控制所指向?qū)ο笊嫫诘闹悄苤羔?,它指向?`shared_ptr` 管理的對(duì)象。其主要用途是解決循環(huán)引用的問(wèn)題,例如兩個(gè)對(duì)象相互引用,導(dǎo)致它們的生命周期無(wú)法正常結(jié)束。
```cpp
std::shared_ptr<int> ptr1(new int(10));
std::weak_ptr<int> ptr2 = ptr1; // ptr2 指向 ptr1 指向的對(duì)象,但不增加對(duì)象的引用計(jì)數(shù)
```
在 `weak_ptr` 有效期內(nèi),可以通過(guò) `lock` 方法獲取其指向的 `shared_ptr`,從而訪問(wèn)其管理的對(duì)象。但要注意,如果這個(gè)對(duì)象已經(jīng)被銷毀,`lock` 會(huì)返回一個(gè)空的 `shared_ptr`。
4. **unique_ptr 的自定義刪除器**
可以為 `unique_ptr` 自定義刪除器,以控制對(duì)象的刪除過(guò)程。例如:
```cpp
struct FooDeleter {
void operator()(Foo* ptr) const { delete ptr; } // 使用 delete 刪除 Foo 類型的對(duì)象
};
std::unique_ptr<Foo, FooDeleter> ptr(new Foo); // 使用自定義刪除器的 unique_ptr
```
|