From 6613a9bf087a7b4ac5ac3b3d2d6e19f6e9fc573d Mon Sep 17 00:00:00 2001 From: Awin Huang Date: Mon, 6 Jun 2022 11:24:20 +0800 Subject: [PATCH] vault backup: 2022-06-06 11:24:20 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Affected files: 02. PARA/03. Resources(資源)/C++17/智慧指標.md --- .../03. Resources(資源)/C++17/智慧指標.md | 20 ++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/02. PARA/03. Resources(資源)/C++17/智慧指標.md b/02. PARA/03. Resources(資源)/C++17/智慧指標.md index ef2fdab..b16cde3 100644 --- a/02. PARA/03. Resources(資源)/C++17/智慧指標.md +++ b/02. PARA/03. Resources(資源)/C++17/智慧指標.md @@ -78,4 +78,22 @@ myBuf->setZero(startAddr, endAddr); bufCopy->setOne(startAddr, endAddr); ``` -`shared_ptr`內部有一個參考記數(reference cou) \ No newline at end of file +`shared_ptr`內部有一個參考記數(reference count)來紀錄它所擁有的指標已經分享給幾個變數了,只要有變數離開了他的scope,參考記數就會減少,反之,要是像上面那樣有人複製的指標,參考記數就會增加,參考記數歸0的時候,指標就會被釋放。 + +有了`shared_ptr`我們就不必擔心delete的責任問題: +```cpp +std::shared_ptr getBuffer(int32_t bufferSize) { + return std::make_shared(bufferSize); +} + +int main() { + auto myBuf = getBuffer(1024); // new(malloc) memory + // use myBuf + + return 0; +} // myBuf delete memory here +``` + +`shared_ptr`有一個問題是可以會「循環參考」(cyclic references),也就是share_ptr A指向另一個share_ptr B,然後share_ptr B又指向share_ptr A,這造成參考記數(reference count)不會減少而永遠無法釋出指標。這個是需要注意的。 + +但是`shared_ptr`還是讓記憶體的ㄈ