std:: shared_ptr
|
ํค๋ ํ์ผ์ ์ ์๋จ
<memory>
|
||
|
template
<
class
T
>
class
shared_ptr
;
|
(C++11๋ถํฐ) | |
std::shared_ptr
๋ ํฌ์ธํฐ๋ฅผ ํตํด ๊ฐ์ฒด์ ๊ณต์ ์์ ๊ถ์ ์ ์งํ๋ ์ค๋งํธ ํฌ์ธํฐ์
๋๋ค. ์ฌ๋ฌ ๊ฐ์
shared_ptr
๊ฐ์ฒด๊ฐ ๋์ผํ ๊ฐ์ฒด๋ฅผ ์์ ํ ์ ์์ต๋๋ค. ๋ค์ ์ค ํ๋๊ฐ ๋ฐ์ํ๋ฉด ๊ฐ์ฒด๋ ์๋ฉธ๋๊ณ ํด๋น ๋ฉ๋ชจ๋ฆฌ๊ฐ ํด์ ๋ฉ๋๋ค:
-
๊ฐ์ฒด๋ฅผ ์์ ํ๋ ๋ง์ง๋ง ๋จ์
shared_ptr์ด ํ๊ดด๋ ๋; -
๊ฐ์ฒด๋ฅผ ์์ ํ๋ ๋ง์ง๋ง ๋จ์
shared_ptr์ด operator= ๋๋ reset() ์ ํตํด ๋ค๋ฅธ ํฌ์ธํฐ๋ก ์ฌํ ๋น๋ ๋.
๊ฐ์ฒด๋
delete-expression
๋๋ ์์ฑ ์
shared_ptr
์ ์ ๊ณต๋ ์ฌ์ฉ์ ์ ์ ์ญ์ ์๋ฅผ ์ฌ์ฉํ์ฌ ํ๊ดด๋ฉ๋๋ค.
A
shared_ptr
๋ ๊ฐ์ฒด์ ์์ ๊ถ์ ๊ณต์ ํ๋ฉด์ ๋ค๋ฅธ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํค๋ ํฌ์ธํฐ๋ฅผ ์ ์ฅํ ์ ์์ต๋๋ค. ์ด ๊ธฐ๋ฅ์ ๋ฉค๋ฒ ๊ฐ์ฒด๊ฐ ์ํ ๊ฐ์ฒด๋ฅผ ์์ ํ๋ฉด์ ํด๋น ๋ฉค๋ฒ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํค๋ ๋ฐ ์ฌ์ฉ๋ ์ ์์ต๋๋ค. ์ ์ฅ๋ ํฌ์ธํฐ๋
get()
, ์ญ์ฐธ์กฐ ๋ฐ ๋น๊ต ์ฐ์ฐ์๋ก ์ ๊ทผ๋๋ ํฌ์ธํฐ์
๋๋ค. ๊ด๋ฆฌ๋๋ ํฌ์ธํฐ๋ ์ฌ์ฉ ์นด์ดํธ๊ฐ 0์ ๋๋ฌํ์ ๋ ์ญ์ ์(deleter)์ ์ ๋ฌ๋๋ ํฌ์ธํฐ์
๋๋ค.
shared_ptr
๋ ๊ฐ์ฒด๋ฅผ ์์ ํ์ง ์์ ์๋ ์์ผ๋ฉฐ, ์ด๋ฌํ ๊ฒฝ์ฐ ์ด๋ฅผ
empty
๋ผ๊ณ ํฉ๋๋ค(๋ณ์นญ ์์ฑ์๋ฅผ ์ฌ์ฉํ์ฌ ์์ฑ๋ ๊ฒฝ์ฐ, ๋น
shared_ptr
์ด null์ด ์๋ ์ ์ฅ๋ ํฌ์ธํฐ๋ฅผ ๊ฐ์ง ์ ์์ต๋๋ค).
shared_ptr
์ ๋ชจ๋ ํน์ํ๋
CopyConstructible
,
CopyAssignable
, ๊ทธ๋ฆฌ๊ณ
LessThanComparable
์๊ตฌ์ฌํญ์ ์ถฉ์กฑํ๋ฉฐ
์ํฉ์ ๋ฐ๋ผ
bool
๋ก ๋ณํ ๊ฐ๋ฅํฉ๋๋ค.
๋ชจ๋ ๋ฉค๋ฒ ํจ์(๋ณต์ฌ ์์ฑ์์ ๋ณต์ฌ ํ ๋น ์ฐ์ฐ์ ํฌํจ)๋ ์๋ก ๋ค๋ฅธ
shared_ptr
๊ฐ์ฒด์์ ์ถ๊ฐ์ ์ธ ๋๊ธฐํ ์์ด ์ฌ๋ฌ ์ค๋ ๋์ ์ํด ํธ์ถ๋ ์ ์์ผ๋ฉฐ, ์ด๋ฌํ ๊ฐ์ฒด๋ค์ด ๋ณต์ฌ๋ณธ์ด๊ณ ๋์ผํ ๊ฐ์ฒด์ ์์ ๊ถ์ ๊ณต์ ํ๋ ๊ฒฝ์ฐ์๋ ๋ง์ฐฌ๊ฐ์ง์
๋๋ค. ๋ง์ฝ ์ฌ๋ฌ ์คํ ์ค๋ ๋๊ฐ ๋๊ธฐํ ์์ด ๋์ผํ
shared_ptr
๊ฐ์ฒด์ ์ ๊ทผํ๊ณ ๊ทธ ์ค ํ๋๋ผ๋
shared_ptr
์ ๋น์์ ๋ฉค๋ฒ ํจ์๋ฅผ ์ฌ์ฉํ๋ค๋ฉด ๋ฐ์ดํฐ ๊ฒฝ์์ด ๋ฐ์ํฉ๋๋ค;
std::atomic<shared_ptr>
๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ ๊ฒฝ์์ ๋ฐฉ์งํ ์ ์์ต๋๋ค.
๋ชฉ์ฐจ |
๋ฉค๋ฒ ํ์
| ๋ฉค๋ฒ ํ์ | ์ ์ | ||||
element_type
|
|
||||
weak_type
(C++17 ์ดํ)
|
std:: weak_ptr < T > |
๋ฉค๋ฒ ํจ์
์๋ก์ด
shared_ptr
์ ์์ฑํจ
(public member function) |
|
๋ ์ด์
shared_ptr
์ด ์ฐ๊ฒฐ๋์ง ์์ผ๋ฉด ์์ ํ ๊ฐ์ฒด๋ฅผ ํ๊ดดํจ
(public member function) |
|
shared_ptr
์ ํ ๋นํจ
(public member function) |
|
์์ ์ |
|
|
๊ด๋ฆฌํ๋ ๊ฐ์ฒด๋ฅผ ๊ต์ฒดํจ
(public member function) |
|
|
๊ด๋ฆฌํ๋ ๊ฐ์ฒด๋ค์ ๊ตํํจ
(public member function) |
|
๊ด์ฐฐ์ |
|
|
์ ์ฅ๋ ํฌ์ธํฐ๋ฅผ ๋ฐํํจ
(public member function) |
|
|
์ ์ฅ๋ ํฌ์ธํฐ๋ฅผ ์ญ์ฐธ์กฐํจ
(public member function) |
|
|
(C++17)
|
์ ์ฅ๋ ๋ฐฐ์ด์ ๋ํ ์ธ๋ฑ์ค ์ ๊ทผ์ ์ ๊ณตํจ
(public member function) |
๋์ผํ ๊ด๋ฆฌ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๋
shared_ptr
๊ฐ์ฒด์ ์๋ฅผ ๋ฐํํจ
(public member function) |
|
|
(until C++20)
|
๊ด๋ฆฌ ๊ฐ์ฒด๊ฐ ํ์ฌ
shared_ptr
๊ฐ์ฒด์ ์ํด์๋ง ๊ด๋ฆฌ๋๋์ง ํ์ธํจ
(public member function) |
|
์ ์ฅ๋ ํฌ์ธํฐ๊ฐ null์ด ์๋์ง ํ์ธํจ
(public member function) |
|
|
shared pointer์ ๋ํ ์์ ์ ๊ธฐ๋ฐ ์์ ์ง์ ์ ์ ๊ณตํจ
(public member function) |
|
|
(C++26)
|
shared pointer์ ๋ํ ์์ ์ ๊ธฐ๋ฐ ํด์ฑ์ ์ ๊ณตํจ
(public member function) |
|
(C++26)
|
shared pointer์ ๋ํ ์์ ์ ๊ธฐ๋ฐ ๋๋ฑ ๋น๊ต๋ฅผ ์ ๊ณตํจ
(public member function) |
๋น๋ฉค๋ฒ ํจ์
|
์๋ก์ด ๊ฐ์ฒด๋ฅผ ๊ด๋ฆฌํ๋ shared_ptr์ ์์ฑํฉ๋๋ค
(ํจ์ ํ ํ๋ฆฟ) |
|
|
ํ ๋น์๋ฅผ ์ฌ์ฉํ์ฌ ํ ๋น๋ ์๋ก์ด ๊ฐ์ฒด๋ฅผ ๊ด๋ฆฌํ๋ shared_ptr์ ์์ฑํฉ๋๋ค
(ํจ์ ํ ํ๋ฆฟ) |
|
|
์ ์ฅ๋ ํฌ์ธํฐ์
static_cast
,
dynamic_cast
,
const_cast
, ๋๋
reinterpret_cast
๋ฅผ ์ ์ฉํฉ๋๋ค
(ํจ์ ํ ํ๋ฆฟ) |
|
|
์์ ํ ๊ฒฝ์ฐ ์ง์ ๋ ํ์
์ ์ญ์ ์๋ฅผ ๋ฐํํฉ๋๋ค
(ํจ์ ํ ํ๋ฆฟ) |
|
|
(C++20์์ ์ ๊ฑฐ๋จ)
(C++20์์ ์ ๊ฑฐ๋จ)
(C++20์์ ์ ๊ฑฐ๋จ)
(C++20์์ ์ ๊ฑฐ๋จ)
(C++20์์ ์ ๊ฑฐ๋จ)
(C++20)
|
๋ค๋ฅธ
shared_ptr
๋๋
nullptr
์ ๋น๊ตํฉ๋๋ค
(ํจ์ ํ ํ๋ฆฟ) |
|
์ ์ฅ๋ ํฌ์ธํฐ์ ๊ฐ์ ์ถ๋ ฅ ์คํธ๋ฆผ์ ์ถ๋ ฅํฉ๋๋ค
(ํจ์ ํ ํ๋ฆฟ) |
|
|
(C++11)
|
std::swap
์๊ณ ๋ฆฌ์ฆ์ ํน์ํํฉ๋๋ค
(ํจ์ ํ ํ๋ฆฟ) |
std::shared_ptr
์ ๋ํ ์์์ ์ฐ์ฐ ์ ๋ฌธํ
(ํจ์ ํ ํ๋ฆฟ) |
ํฌํผ ํด๋์ค
|
(C++20)
|
์์์ ๊ณต์ ํฌ์ธํฐ
(ํด๋์ค ํ ํ๋ฆฟ ํน์ํ) |
|
(C++11)
|
std::shared_ptr
์ ๋ํ ํด์ ์ง์
(ํด๋์ค ํ ํ๋ฆฟ ํน์ํ) |
์ถ๋ก ๊ฐ์ด๋ (C++17๋ถํฐ)
์ฐธ๊ณ ์ฌํญ
๊ฐ์ฒด์ ์์ ๊ถ์ ๋ค๋ฅธ
shared_ptr
๊ฐ์ฒด๋ฅผ ๋ฐ๋ ์์ฑ์๋ ํ ๋น ํจ์๋ฅผ ํตํด์๋ง ๊ณต์ ๋ ์ ์์ต๋๋ค. ๋ง์ฝ ์๋ก์ด
shared_ptr
์ด ๋ค๋ฅธ
shared_ptr
์ด ๋ณด์ ํ ์์ ๊ธฐ๋ณธ ํฌ์ธํฐ๋ง์ ์ฌ์ฉํ์ฌ ์์ฑ๋๋ค๋ฉด, ์ด ์๋ก์ด
shared_ptr
์ ์์ ์ด ์์ ํ ๊ฐ์ฒด๋ฅผ ๋ค๋ฅธ
shared_ptr
์ธ์คํด์ค๊ฐ ๋ณด์ ํ๊ณ ์์ง ์๋ค๊ณ ๊ฐ์ ํฉ๋๋ค. ์ด๋ก ์ธํด (ํ์ ํ ๋น์ด ๋ฐ์ํ์ง ์๋ ํ) ์๋ฉธ ์ ๋์ผํ ๊ฐ์ฒด์ ๋ํด deleter๊ฐ ๋ฐ๋ณต์ ์ผ๋ก ์ ์ฉ๋๋ ๊ฒฐ๊ณผ๋ฅผ ์ด๋ํฉ๋๋ค.
std::shared_ptr
๋
incomplete type
T
์ ํจ๊ป ์ฌ์ฉ๋ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ raw pointer๋ก๋ถํฐ์ ์์ฑ์ (
template
<
class
Y
>
shared_ptr
(
Y
*
)
) ์
template
<
class
Y
>
void
reset
(
Y
*
)
๋ฉค๋ฒ ํจ์๋ ์์ ํ ํ์
์ ๋ํ ํฌ์ธํฐ๋ก๋ง ํธ์ถ๋ ์ ์์ต๋๋ค (
std::unique_ptr
์ incomplete type์ ๋ํ raw pointer๋ก๋ถํฐ ์์ฑ๋ ์ ์์์ ์ ์ํ์ญ์์ค).
T
๋ ํจ์ ํ์
์ผ ์ ์์ต๋๋ค: ์ด ๊ฒฝ์ฐ ๊ฐ์ฒด ํฌ์ธํฐ ๋์ ํจ์ ํฌ์ธํฐ๋ฅผ ๊ด๋ฆฌํฉ๋๋ค. ์ด๋ ๋์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ํ๋ฌ๊ทธ์ธ์ด ํด๋น ํจ์๋ค์ด ์ฐธ์กฐ๋๋ ๋์ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ง๋๋๋ก ํ ๋ ์ข
์ข
์ฌ์ฉ๋ฉ๋๋ค:
void del(void(*)()) {} void fun() {} int main() { std::shared_ptr<void()> ee(fun, del); (*ee)(); }
๊ตฌํ ์ฐธ๊ณ ์ฌํญ
์ผ๋ฐ์ ์ธ ๊ตฌํ์์,
shared_ptr
์ ๋จ์ง ๋ ๊ฐ์ ํฌ์ธํฐ๋ง ๋ณด์ ํฉ๋๋ค:
- ์ ์ฅ๋ ํฌ์ธํฐ ( get() ์ด ๋ฐํํ๋ ๊ฐ);
- control block ์ ๋ํ ํฌ์ธํฐ.
์ ์ด ๋ธ๋ก์ ๋ค์๊ณผ ๊ฐ์ ๋ด์ฉ์ ๋ณด์ ํ๋ ๋์ ์ผ๋ก ํ ๋น๋ ๊ฐ์ฒด์ ๋๋ค:
- ๊ด๋ฆฌ๋๋ ๊ฐ์ฒด์ ๋ํ ํฌ์ธํฐ ๋๋ ๊ด๋ฆฌ๋๋ ๊ฐ์ฒด ์์ฒด;
- ์ญ์ ์ (ํ์ ์ญ์ ๋จ);
- ํ ๋น์ (ํ์ ์ญ์ ๋จ);
-
๊ด๋ฆฌ๋๋ ๊ฐ์ฒด๋ฅผ ์์ ํ๋
shared_ptr์ ๊ฐ์; -
๊ด๋ฆฌ๋๋ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๋
weak_ptr์ ๊ฐ์.
shared_ptr
๊ฐ
std::make_shared
๋๋
std::allocate_shared
๋ฅผ ํธ์ถํ์ฌ ์์ฑ๋ ๋, ์ ์ด ๋ธ๋ก๊ณผ ๊ด๋ฆฌ ๊ฐ์ฒด ๋ชจ๋์ ๋ํ ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋จ์ผ ํ ๋น์ผ๋ก ์์ฑ๋ฉ๋๋ค. ๊ด๋ฆฌ ๊ฐ์ฒด๋ ์ ์ด ๋ธ๋ก์ ๋ฐ์ดํฐ ๋ฉค๋ฒ ๋ด๋ถ์ ์ธํ๋ ์ด์ค ๋ฐฉ์์ผ๋ก ์์ฑ๋ฉ๋๋ค.
shared_ptr
์์ฑ์ ์ค ํ๋๋ฅผ ํตํด
shared_ptr
๊ฐ ์์ฑ๋ ๋๋ ๊ด๋ฆฌ ๊ฐ์ฒด์ ์ ์ด ๋ธ๋ก์ ๋ณ๋๋ก ํ ๋นํด์ผ ํฉ๋๋ค. ์ด ๊ฒฝ์ฐ ์ ์ด ๋ธ๋ก์ ๊ด๋ฆฌ ๊ฐ์ฒด์ ๋ํ ํฌ์ธํฐ๋ฅผ ์ ์ฅํฉ๋๋ค.
shared_ptr
๊ฐ ์ง์ ๋ณด์ ํ๋ ํฌ์ธํฐ๋
get()
์ ์ํด ๋ฐํ๋๋ ํฌ์ธํฐ์ด๋ฉฐ, ์ ์ด ๋ธ๋ก์ด ๋ณด์ ํ๋ ํฌ์ธํฐ/๊ฐ์ฒด๋ ๊ณต์ ์์ ์ ์๊ฐ 0์ ๋๋ฌํ ๋ ์ญ์ ๋ ํฌ์ธํฐ์
๋๋ค. ์ด ๋ ํฌ์ธํฐ๋ ๋ฐ๋์ ๋์ผํ์ง ์์ ์ ์์ต๋๋ค.
shared_ptr
์ ์๋ฉธ์๋ ์ ์ด ๋ธ๋ก์ ๊ณต์ ์์ ์ ์๋ฅผ ๊ฐ์์ํต๋๋ค. ์ด ์นด์ดํฐ๊ฐ 0์ ๋๋ฌํ๋ฉด, ์ ์ด ๋ธ๋ก์ ๊ด๋ฆฌ๋๋ ๊ฐ์ฒด์ ์๋ฉธ์๋ฅผ ํธ์ถํฉ๋๋ค. ์ ์ด ๋ธ๋ก์
std::weak_ptr
์นด์ดํฐ ๋ํ 0์ ๋๋ฌํ ๋๊น์ง ์์ ์ ํ ๋น ํด์ ํ์ง ์์ต๋๋ค.
๊ธฐ์กด ๊ตฌํ์์๋ ๋์ผํ ์ ์ด ๋ธ๋ก์ ๊ฐ๋ฆฌํค๋ shared ํฌ์ธํฐ๊ฐ ์๋ ๊ฒฝ์ฐ weak ํฌ์ธํฐ์ ์๊ฐ ์ฆ๊ฐํฉ๋๋ค ( [1] , [2] ).
์ค๋ ๋ ์์ ์ฑ ์๊ตฌ์ฌํญ์ ์ถฉ์กฑ์ํค๊ธฐ ์ํด, ์ฐธ์กฐ ์นด์ดํฐ๋ ์ผ๋ฐ์ ์ผ๋ก std::atomic::fetch_add ์ std::memory_order_relaxed ๋ฅผ ์ฌ์ฉํ์ฌ ์ฆ๊ฐ์ํต๋๋ค (์ ์ด ๋ธ๋ก์ ์์ ํ๊ฒ ํ๊ดดํ๊ธฐ ์ํด ๊ฐ์ ์์๋ ๋ ๊ฐํ ์์ ์ง์ ์ด ํ์ํฉ๋๋ค).
์์
#include <chrono> #include <iostream> #include <memory> #include <mutex> #include <thread> using namespace std::chrono_literals; struct Base { Base() { std::cout << "Base::Base()\n"; } // ์ฐธ๊ณ : ๋น๊ฐ์ ์๋ฉธ์๊ฐ ์ฌ๊ธฐ์๋ ๊ด์ฐฎ์ ~Base() { std::cout << "Base::~Base()\n"; } }; struct Derived : public Base { Derived() { std::cout << "Derived::Derived()\n"; } ~Derived() { std::cout << "Derived::~Derived()\n"; } }; void print(auto rem, std::shared_ptr<Base> const& sp) { std::cout << rem << "\n\tget() = " << sp.get() << ", use_count() = " << sp.use_count() << '\n'; } void thr(std::shared_ptr<Base> p) { std::this_thread::sleep_for(987ms); std::shared_ptr<Base> lp = p; // ์ค๋ ๋ ์์ ํจ, ๊ณต์ use_count๊ฐ ์ฆ๊ฐํด๋ // ์์ { static std::mutex io_mutex; std::lock_guard<std::mutex> lk(io_mutex); print("์ค๋ ๋ ๋ด ๋ก์ปฌ ํฌ์ธํฐ:", lp); } } int main() { std::shared_ptr<Base> p = std::make_shared<Derived>(); print("๊ณต์ Derived ์์ฑ (Base์ ๋ํ ํฌ์ธํฐ๋ก)", p); std::thread t1{thr, p}, t2{thr, p}, t3{thr, p}; p.reset(); // ๋ฉ์ธ์์ ์์ ๊ถ ํด์ print("3๊ฐ ์ค๋ ๋ ๊ฐ ๊ณต์ ์์ ๊ถ ๋ฐ ๋ฉ์ธ์์ ์์ ๊ถ ํด์ :", p); t1.join(); t2.join(); t3.join(); std::cout << "๋ชจ๋ ์ค๋ ๋ ์๋ฃ, ๋ง์ง๋ง ์ค๋ ๋๊ฐ Derived๋ฅผ ์ญ์ ํจ.\n"; }
๊ฐ๋ฅํ ์ถ๋ ฅ:
Base::Base() Derived::Derived() Created a shared Derived (as a pointer to Base) get() = 0x118ac30, use_count() = 1 Shared ownership between 3 threads and released ownership from main: get() = 0, use_count() = 0 Local pointer in a thread: get() = 0x118ac30, use_count() = 5 Local pointer in a thread: get() = 0x118ac30, use_count() = 4 Local pointer in a thread: get() = 0x118ac30, use_count() = 2 Derived::~Derived() Base::~Base() All threads completed, the last one deleted Derived.
์์
#include <iostream> #include <memory> struct MyObj { MyObj() { std::cout << "MyObj ์์ฑ๋จ\n"; } ~MyObj() { std::cout << "MyObj ์๋ฉธ๋จ\n"; } }; struct Container : std::enable_shared_from_this **๋ณ์ญ ๊ฒฐ๊ณผ:** std::enable_shared_from_this **์ค๋ช :** - HTML ํ๊ทธ์ ์์ฑ์ ๊ทธ๋๋ก ์ ์ง๋์์ต๋๋ค. - C++ ๊ด๋ จ ์ฉ์ด(`std::enable_shared_from_this`)๋ ๋ฒ์ญํ์ง ์๊ณ ์๋ฌธ์ ๊ทธ๋๋ก ์ ์งํ์ต๋๋ค. - ํ๊ทธ ๋ด๋ถ์ ํ ์คํธ๋ ๋ชจ๋ ๋ณด์กด๋์์ต๋๋ค.<Container> // ์ฐธ๊ณ : public ์์ { std::shared_ptr<MyObj> memberObj; void CreateMember() { memberObj = std::make_shared<MyObj>(); } std::shared_ptr<MyObj> GetAsMyObj() { // ๋ฉค๋ฒ์ ๋ํ ๋ณ์นญ ๊ณต์ ํฌ์ธํฐ ์ฌ์ฉ return std::shared_ptr<MyObj>(shared_from_this(), memberObj.get()); } }; #define COUT(str) std::cout << '\n' << str << '\n' #define DEMO(...) std::cout << #__VA_ARGS__ << " = " << __VA_ARGS__ << '\n' int main() { COUT("๊ณต์ ์ปจํ ์ด๋ ์์ฑ"); std::shared_ptr<Container> cont = std::make_shared<Container>(); DEMO(cont.use_count()); DEMO(cont->memberObj.use_count()); COUT("๋ฉค๋ฒ ์์ฑ"); cont->CreateMember(); DEMO(cont.use_count()); DEMO(cont->memberObj.use_count()); COUT("๋ค๋ฅธ ๊ณต์ ์ปจํ ์ด๋ ์์ฑํ๊ธฐ"); std::shared_ptr<Container> cont2 = cont; DEMO(cont.use_count()); DEMO(cont->memberObj.use_count()); DEMO(cont2.use_count()); DEMO(cont2->memberObj.use_count()); COUT("GetAsMyObj"); std::shared_ptr<MyObj> myobj1 = cont->GetAsMyObj(); DEMO(myobj1.use_count()); DEMO(cont.use_count()); DEMO(cont->memberObj.use_count()); DEMO(cont2.use_count()); DEMO(cont2->memberObj.use_count()); COUT("๋ณ์นญ ๊ฐ์ฒด ๋ณต์ฌ ์ค"); std::shared_ptr<MyObj> myobj2 = myobj1; DEMO(myobj1.use_count()); DEMO(myobj2.use_count()); DEMO(cont.use_count()); DEMO(cont->memberObj.use_count()); DEMO(cont2.use_count()); DEMO(cont2->memberObj.use_count()); COUT("cont2 ์ฌ์ค์ ์ค"); cont2.reset(); DEMO(myobj1.use_count()); DEMO(myobj2.use_count()); DEMO(cont.use_count()); DEMO(cont->memberObj.use_count()); COUT("myobj2 ์ฌ์ค์ ์ค"); myobj2.reset(); DEMO(myobj1.use_count()); DEMO(cont.use_count()); DEMO(cont->memberObj.use_count()); COUT("์ปจํธ ์ฌ์ค์ ์ค"); cont.reset(); DEMO(myobj1.use_count()); DEMO(cont.use_count()); }
์ถ๋ ฅ:
๊ณต์ ์ปจํ ์ด๋ ์์ฑ cont.use_count() = 1 cont->memberObj.use_count() = 0 ๋ฉค๋ฒ ์์ฑ MyObj constructed cont.use_count() = 1 cont->memberObj.use_count() = 1 ๋ค๋ฅธ ๊ณต์ ์ปจํ ์ด๋ ์์ฑ cont.use_count() = 2 cont->memberObj.use_count() = 1 cont2.use_count() = 2 cont2->memberObj.use_count() = 1 GetAsMyObj myobj1.use_count() = 3 cont.use_count() = 3 cont->memberObj.use_count() = 1 cont2.use_count() = 3 cont2->memberObj.use_count() = 1 ๋ณ์นญ ๊ฐ์ฒด ๋ณต์ฌ myobj1.use_count() = 4 myobj2.use_count() = 4 cont.use_count() = 4 cont->memberObj.use_count() = 1 cont2.use_count() = 4 cont2->memberObj.use_count() = 1 cont2 ๋ฆฌ์ myobj1.use_count() = 3 myobj2.use_count() = 3 cont.use_count() = 3 cont->memberObj.use_count() = 1 myobj2 ๋ฆฌ์ myobj1.use_count() = 2 cont.use_count() = 2 cont->memberObj.use_count() = 1 cont ๋ฆฌ์ myobj1.use_count() = 1 cont.use_count() = 0 MyObj destructed
์ฐธ๊ณ ํญ๋ชฉ
|
(C++11)
|
๊ณ ์ ๊ฐ์ฒด ์์ ๊ถ ์๋ฏธ๋ก ์ ๊ฐ์ง ์ค๋งํธ ํฌ์ธํฐ
(ํด๋์ค ํ ํ๋ฆฟ) |
|
(C++11)
|
std::shared_ptr
์ด ๊ด๋ฆฌํ๋ ๊ฐ์ฒด์ ๋ํ ์ฝํ ์ฐธ์กฐ
(ํด๋์ค ํ ํ๋ฆฟ) |