vault backup: 2022-06-06 11:44:20

Affected files:
02. PARA/03. Resources(資源)/C++17/智慧指標.md
This commit is contained in:
2022-06-06 11:44:20 +08:00
parent 877b5a5b46
commit c5616acd70

View File

@@ -1,7 +1,7 @@
unique_ptr與shared_ptr都是智慧指標箱對於原本的raw pointer智慧指標使用起來更方便也不用擔心delete的問題。 [`unique_ptr`](https://en.cppreference.com/w/cpp/memory/unique_ptr)與[`shared_ptr`](https://en.cppreference.com/w/cpp/memory/shared_ptr)都是智慧指標箱對於原本的raw pointer智慧指標使用起來更方便也不用擔心delete的問題。
## unique_ptr ## unique_ptr
[`unique_ptr`](https://en.cppreference.com/w/cpp/memory/unique_ptr)的特點是,它保證在一個時間內,只會有一個指標的擁有者,也就是這個指標不能被複製跟移動,當`unique_ptr`離開它的scope時候它所擁有的指標也隨之被delete。這讓你不用擔心memory leak的問題。 `unique_ptr` 的特點是,它保證在一個時間內,只會有一個指標的擁有者,也就是這個指標不能被複製跟移動,當 `unique_ptr` 離開它的scope時候它所擁有的指標也隨之被delete。這讓你不用擔心memory leak的問題。
假設我們有一個class叫 `BigBuffer` ,原本分配記憶體的方法: 假設我們有一個class叫 `BigBuffer` ,原本分配記憶體的方法:
```cpp ```cpp
BigBuffer* bigBuf = new BigBuffer(bufferSize); BigBuffer* bigBuf = new BigBuffer(bufferSize);
@@ -60,7 +60,7 @@ std::unique_ptr<int> ptr2 = ptr1; // Error
## shared_ptr ## shared_ptr
建立一個[`shared_ptr`](https://en.cppreference.com/w/cpp/memory/shared_ptr)是使用[`std::make_shared()`](https://en.cppreference.com/w/cpp/memory/shared_ptr/make_shared) 建立一個 `shared_ptr` 是使用[`std::make_shared()`](https://en.cppreference.com/w/cpp/memory/shared_ptr/make_shared)
```cpp ```cpp
auto myBuf = std::make_shared<BigBuffer>(bufferSize); auto myBuf = std::make_shared<BigBuffer>(bufferSize);
``` ```
@@ -96,4 +96,4 @@ int main() {
`shared_ptr` 有一個問題是可以會「循環參考」cyclic references也就是 share_ptr A 指向另一個 share_ptr B ,然後 share_ptr B 又指向 share_ptr A這造成參考記數reference count不會減少而永遠無法釋出指標。這個是需要注意的。 `shared_ptr` 有一個問題是可以會「循環參考」cyclic references也就是 share_ptr A 指向另一個 share_ptr B ,然後 share_ptr B 又指向 share_ptr A這造成參考記數reference count不會減少而永遠無法釋出指標。這個是需要注意的。
但是`shared_ptr`還是讓記憶體的管理問題減少很多,應該用`shared_ptr`來代替`new` & `delete` 但是 `shared_ptr` 還是讓記憶體的管理問題大大減少,應該用 `shared_ptr` 來代替 `new` & `delete`