Rename [C++17 筆記] 智慧指標:unique_ptr & shared_ptr to [C++ 筆記] 智慧指標:unique_ptr & shared_ptr

This commit is contained in:
2022-06-08 15:13:43 +08:00
parent 65b457db49
commit fef134ef94

View File

@@ -1,17 +1,17 @@
---
slug: "[C++17 筆記] 智慧指標unique_ptr & shared_ptr"
title: "[C++17 筆記] 智慧指標unique_ptr & shared_ptr"
slug: "[C++ 筆記] 智慧指標unique_ptr & shared_ptr"
title: "[C++ 筆記] 智慧指標unique_ptr & shared_ptr"
description:
toc: true
authors:
- awin
tags:
- c++17
- c++
- memory
categories:
- Programming
series:
- C++17 筆記
- C++ 筆記
date: 2019-12-01T00:00:00
lastmod: 2019-12-01T00:00:00
featuredVideo:
@@ -40,15 +40,22 @@ auto bigBuf = std::make_unique<BigBuffer>(bufferSize);
// bigBuf will be released when exiting scope
```
我們統一用[`std::make_unique<>`](https://en.cppreference.com/w/cpp/memory/unique_ptr/make_unique)這個template function來建立 `unique_ptr` ,角括號 `<>` 裡面要帶入你要建立的型別,後面的括號 `()` 就是型別的constructor使用起來跟 `new` 是一樣的。
因為 `std::make_unique<>` 裡面已經有表明型別了,所以變數就用 `auto` 就可以了,不用再寫一次型別。
我們統一用[`std::make_unique<>`](https://en.cppreference.com/w/cpp/memory/unique_ptr/make_unique)這個template function來建立 `unique_ptr` ,角括號 `<>` 裡面要帶入你要建立的型別,後面的括號 `()` 就是型別的constructor使用起來跟 `new` 是一樣的。
因為 `std::make_unique<>` 裡面已經有表明型別了,所以變數就用 `auto` 就可以了,不用再寫一次型別。
一旦 `unique_ptr` 建立之後,使用起來就跟一般指標沒有兩樣,都是用 `->` 來操作:`bigBuf->setXXX()` or `bigBuf->getXXX()`
但是別忘記 `unique_ptr` 本身還是一個local variable所以我們可以用 `.` 來操作 `unique_ptr` ,例如我們可以用 `.reset()` 重新配一個指標:
一旦 `unique_ptr` 建立之後,使用起來就跟一般指標沒有兩樣,都是用 `->` 來操作,例如
```cpp
bigBuf.reset(std::make_unique<BigBuffer>(bufferSizeLarger));
bigBuf->setXXX();
bigBuf->getXXX();
```
這時候舊指標會自動delete然後指向新的指標如果記憶體分配有成功的話或者指向 `nullptr` (記憶體分配失敗)。
但是別忘記 `unique_ptr` 本身還是一個local variable所以我們可以用 `.` 來操作 `unique_ptr` ,例如我們可以用 `.reset()` 重新配一個指標:
```cpp
BigBuffer* pBuffer = new BigBuffer();
bigBuf.reset(pBuffer);
```
這時候舊指標會自動delete如果記憶體分配有成功的話bigBuf會接管剛剛new出來的指標或者變成 `nullptr` (記憶體分配失敗)。
如果單純想要釋放指標,那就單純的呼叫 `reset()` 就好。
```cpp
bigBuf.reset(); // Now I'm nullptr
@@ -64,7 +71,7 @@ auto intArray = std::make_unique<int[]>(1024);
intArray[5] = 555;
```
不過對於陣列的操作更建議使用 `std::array`
不過對於陣列的操作更建議使用 `std::array`
如果有什麼特殊原因讓你決定不再讓 `unique_ptr` 來幫你管理指標,可以用 `release()` 來讓出指標:
```cpp