際際滷

際際滷Share a Scribd company logo
亠舒仍仆仂 仗仂 仆舒亶仗仂
仂亰仄仆 于从舒亰于仆亳从亳 C++
||
The C++'s simplest smart pointers
in depth
亠于舒仆仆 仗舒仄' 于 C++
 仆亠 从亠于舒仆仆 仗舒仄'
 亳仄舒仆仆 亠  仆舒仍亰舒 ==
Resource acquisition is initialization == RAII
RAII
 仂亢亠仆 亠 仂弍亞仂舒 于 从仍舒, 于 磻仂仄:
 从仂仆从仂 仂亳仄 亠  于舒仆仂于仍ム 于
仆于舒舒仆亳 从仍舒, 舒弍仂 从亳亟舒 于亳从仍ム亠仆仆, 磻仂 亠
仆亠 于亟舒 亰仂弍亳亳
 亟亠从仂 亰于仍仆 亠  仆亠 从亳亟舒 于亳从仍ム亠仆
 亠 亰舒于亢亟亳 亰弍亠亞舒 于 仂弍'从 RAII-
从仍舒, 磻亳亶 于仂亠仆亳亶 仆舒 亠从 亳
亳仄舒仂于亳亶, 舒弍仂 仄舒 舒 仆于舒仆仆
仂弍仄亠亢亠仆亳亶 仆亳仄 舒从亳仄 仂弍'从仂仄
 亠亰仗亠从舒 于亳仆从仂于亳 亳舒亶 == ES
 仂仍亠亞 舒仆仆亶 于亳亟 亰 仆从 亳 亳从仍
亠亠于舒亞亳 RAII 仆舒亟 亰弍亳舒亠仄
仄 (GC)
 丕仆仂仄仆亠 从亠于舒仆仆 亠舒仄亳:
仂仗亠舒亳于仆舒 仗舒仄', 仗仂从 (thread), 于亟从亳亳亶
仂从亠, 于亟从亳亳亶 舒亶仍, 亰舒弍仍仂从仂于舒仆亳亶
仄兵ム亠从, 亰'亟仆舒仆仆 亰 
 亠亠亟弍舒于舒仆亳亶 舒 仆于舒仆仆 仂弍'从舒
 弌仄
 亠从亳于仆亠 于亳从仂亳舒仆仆 仗舒仄'
 亟仆 仆亠从仂仆仂仍仂于舒仆亳 亰舒亳仄仂从 亟仍
于亳亟舒仍亠仆仆 仄
亠亠于舒亞亳 亰弍亳舒舒 仄 仆舒亟 RAII
 GC 仗仂亠 于亳从仂亳仂于于舒亳 于 仗仂亳
亳舒
 GC 亟仂亰于仂仍 亠亠从亳于仆仂 亠舒仍亰于舒亳 亟亠磻
仗仂亶仆 (persistent) 从亳 亟舒仆亳
 RAII 于亳仄舒亞舒 亟亳亳仗仍仆亳 仂亰仂弍仆亳从舒
 仂亟 弍舒亞舒仂 仗仂亞舒仄 仆舒仗亳舒仆亳亶 仆舒 亟亠于仆仂仄
C++, 舒从仂于仂 仆舒 C
 亳亟舒仍亠仆仆 亟于 (UB)
 仂亰仄亠仆于舒仆仆 于亳仂亞仂 于从舒亰于仆亳从舒 (UB)
 仂从舒仆仆 仗舒仄'
 舒于 从仂亠从仆亳亶 从仂亟 从仍舒亟仆仂
仄仂亟亳从于舒亳/亠舒从仂亳亳
亳从仍舒亟 丐亳仄舒仂于亳亶 于从舒亰于仆亳从 1
1 bool showDonut(int windowId)
2 {
3 Painter * const painter = makePainter(windowId);
4 return painter->showDonut();
5 }
亳从仍舒亟 丐亳仄舒仂于亳亶 于从舒亰于仆亳从 2
1 bool showDonut(int windowId)
2 {
3 Painter * const painter = makePainter(windowId);
4 const bool result = painter->showDonut();
5 delete painter;
6 return result;
7 }
亳从仍舒亟 丐亳仄舒仂于亳亶 于从舒亰于仆亳从 3
1 bool showDonut(int windowId)
2 {
3 Painter * const painter = makePainter(windowId);
4 if (!painter->hasKitchen())
5 return false;
6 const bool result = painter->showDonut();
7 delete painter;
8 return result;
9 }
亳从仍舒亟 丐亳仄舒仂于亳亶 于从舒亰于仆亳从 4
1 bool showDonut(int windowId)
2 {
3 Painter * const painter = makePainter(windowId);
4 if (!painter->hasKitchen()) {
5 delete painter;
6 return false;
7 }
8 const bool result = painter->showDonut();
9 delete painter;
10 return result;
11 }
亳从仍舒亟 丐亳仄舒仂于亳亶 于从舒亰于仆亳从 5
1 bool showDonut(int windowId)
2 {
3 Painter * const painter = makePainter(windowId);
4 try {
5 if (!painter->hasKitchen()) {
6 delete painter;
7 return false;
8 }
9 const bool result = painter->showDonut();
10 delete painter;
11 return result;
12 }
13 catch (...) {
14 delete painter;
15 throw;
16 }
17 }
亳从仍舒亟 丐亳仄舒仂于亳亶 于从舒亰于仆亳从 6
1 bool showDonut(int windowId)
2 {
3 Painter * const painter = makePainter(windowId);
4 try {
5 Kitchen * const kitchen = painter->makeKitchen();
6 if (!kitchen) {
7 delete painter;
8 return false;
9 }
10 const bool result = kitchen->showDonut();
11 delete kitchen;
12 delete painter;
13 return result;
14 }
15 catch (...) {
16 delete painter;
17 throw;
18 }
19 }
亳从仍舒亟 丐亳仄舒仂于亳亶 于从舒亰于仆亳从 7
1 bool showDonut(int windowId)
2 {
3 Painter * const painter = makePainter(windowId);
4 Kitchen * kitchen = nullptr;
5 try {
6 kitchen = painter->makeKitchen();
7 if (!kitchen) {
8 delete painter;
9 return false;
10 }
11 const bool result = kitchen->showDonut();
12 delete kitchen;
13 delete painter;
14 return result;
15 }
16 catch (...) {
17 delete kitchen;
18 delete painter;
19 throw;
20 }
21 }
亳从仍舒亟 丐亳仄舒仂于亳亶 于从舒亰于仆亳从 2
1 bool showDonut(int windowId)
2 {
3 Painter * const painter = makePainter(windowId);
4 const bool result = painter->showDonut();
5 delete painter;
6 return result;
7 }
1 bool showDonut(int windowId)
2 {
3 using Ptr = const
std::unique_ptr<Painter>;
4 Ptr painter(makePainter(windowId));
5 return painter->showDonut();
6 }
亳从仍舒亟 丐亳仄舒仂于亳亶 于从舒亰于仆亳从 4
1 bool showDonut(int windowId)
2 {
3 Painter * const painter = makePainter(windowId);
4 if (!painter->hasKitchen()) {
5 delete painter;
6 return false;
7 }
8 const bool result = painter->showDonut();
9 delete painter;
10 return result;
11 }
1 bool showDonut(int windowId)
2 {
3 using Ptr = const
std::unique_ptr<Painter>;
4 Ptr painter(makePainter(windowId));
5 if (!painter->hasKitchen())
6 return false;
7 return painter->showDonut();
8 }
亳从仍舒亟 丐亳仄舒仂于亳亶 于从舒亰于仆亳从 5
1 bool showDonut(int windowId)
2 {
3 Painter * const painter = makePainter(windowId);
4 try {
5 if (!painter->hasKitchen()) {
6 delete painter;
7 return false;
8 }
9 const bool result = painter->showDonut();
10 delete painter;
11 return result;
12 }
13 catch (...) {
14 delete painter;
15 throw;
16 }
17 }
1 bool showDonut(int windowId)
2 {
3 using Ptr = const
std::unique_ptr<Painter>;
4 Ptr painter(makePainter(windowId));
5 if (!painter->hasKitchen())
6 return false;
7 return painter->showDonut();
8 }
亳从仍舒亟 丐亳仄舒仂于亳亶 于从舒亰于仆亳从 7
1 bool showDonut(int windowId)
2 {
3 Painter * const painter = makePainter(windowId);
4 Kitchen * kitchen = nullptr;
5 try {
6 kitchen = painter->makeKitchen();
7 if (!kitchen) {
8 delete painter;
9 return false;
10 }
11 const bool result = kitchen->showDonut();
12 delete kitchen;
13 delete painter;
14 return result;
15 }
16 catch (...) {
17 delete kitchen;
18 delete painter;
19 throw;
20 }
21 }
1 bool showDonut(int windowId)
2 {
3 using Ptr = const
std::unique_ptr<Painter>;
4 Ptr painter(makePainter(windowId));
5 using Kptr = const
std::unique_ptr<Kitchen>;
6 Kptr kitchen(painter->makeKitchen());
7 if (!kitchen)
8 return false;
9 return kitchen->showDonut();
10 }
亳从仍舒亟 仆亠亠亶 1
1 // Interface 1
2 Cookie * makeCookie(int size);
3 bool showCookie(Cookie * cookie);
4
5 // Interface 2
6 Cookie * getCookie(int size);
7 bool eatCookie(Cookie * cookie);
亳从仍舒亟 仆亠亠亶 2
1 // Interface 1
2 Cookie * makeCookie(int size);
3 bool showCookie(Cookie & cookie);
4
5 // Interface 2
6 Cookie & getCookie(int size);
7 bool eatCookie(Cookie * cookie);
1 // Interface 1
2 Cookie * makeCookie(int size);
3 bool showCookie(Cookie * cookie);
4
5 // Interface 2
6 Cookie * getCookie(int size);
7 bool eatCookie(Cookie * cookie);
亳从仍舒亟 仆亠亠亶 3
1 // Interface 1
2 Cookie * makeCookie(int size);
3 bool showCookie(Cookie * cookie);
4
5 // Interface 2
6 Cookie * getCookie(int size);
7 bool eatCookie(Cookie * cookie);
1 // Interface 1
2 std::unique_ptr<Cookie> makeCookie(int size);
3 bool showCookie(Cookie * cookie);
4
5 // Interface 2
6 Cookie * getCookie(int size);
7 bool eatCookie(std::unique_ptr<Cookie> && cookie);
亳从仍舒亟 仆亠亠亶 4
1 // Interface 1
2 std::unique_ptr<Cookie> makeCookie(int size);
3 bool showCookie(std::observer_ptr<Cookie> cookie);
4 // std::observer_ptr may land in C++2x
5 // Interface 2
6 std::observer_ptr<Cookie> getCookie(int size);
7 bool eatCookie(std::unique_ptr<Cookie> && cookie);
1 // Interface 1
2 std::unique_ptr<Cookie> makeCookie(int size);
3 bool showCookie(Cookie * cookie);
4
5 // Interface 2
6 Cookie * getCookie(int size);
7 bool eatCookie(std::unique_ptr<Cookie> && cookie);
亳从仍舒亟 仂亳于舒 3
2 std::unique_ptr<Cookie> makeCookie(int size);
7 bool eatCookie(std::unique_ptr<Cookie> && cookie);
1 auto cookie = makeCookie(47);
2 cookie->coverWithCream();
3 if (eatCookie(std::move(cookie)))
4 std::cout << "Yum!n";
亳从仍舒亟 仂亳于舒 1
2 Cookie * makeCookie(int size);
7 bool eatCookie(Cookie * cookie);
1 auto * cookie = makeCookie(47);
2 try {
3 cookie->coverWithCream();
4 }
5 catch (...) {
6 delete cookie;
7 throw;
8 }
9 if (eatCookie(cookie)) {
10 std::cout << "Yum!n";
11 cookie = nullptr;
12 }
13 else
14 delete cookie;
亠从亳于仆 unique_ptr
 亠舒仍亰舒 unique_ptr 于亳从仂亳仂于 Empty
base optimization (EBO)
 仂亢仆舒 仂仗亠舒 仆舒亟 unique_ptr 亠仂亠亳仆仂
仗仂于亳仆仆舒 弍亳 舒从仂 亢 于亳亟从仂, 磻
于亟仗仂于亟仆舒 仂仗亠舒 仆舒亟 亞仂仍亳仄 于从舒亰于仆亳从仂仄
 template <class T, class Deleter = std::default_delete<T>>
 class unique_ptr;
 sizeof(std::unique_ptr<T, Deleter>) == sizeof(T *)
 // (磻仂 Deleter  仗仂仂亢仆亶 从仍舒)
unique_ptr 亳 亠从?
 舒仂 仂亞仂仍仂于舒亳 仂弍'从亳 仆舒 亠从 
仆从 舒 亰舒 亰仆舒亠仆仆礆  从仍舒舒 从仂仍亳 亠
仄仂亢仍亳于仂: 于弍亟仂于舒仆 亳仗亳, 从仍舒亳 舒仆亟舒仆仂
弍弍仍仂亠从亳, 仆 仗仂 从亳 舒 从仍舒亳. 丶亠
仗仂亠  亠亠从亳于仆亠.
 仂仍仄仂仆亳亶 仂弍'从
 从舒亰于仆亳从 仆舒 亠舒仍亰舒 (从仍舒) ==
Pointer to implementation == Pimpl idiom ==
Opaque pointer
unique_ptr 亳 亠从? (2)
 仂弍亠仆 舒仆 于亟仆仂 - nullptr (从舒亠
std::optional 亰 C++17)
 亟亠舒 仂弍'从舒 仗仂于亳仆仆舒 弍亳 舒仍仂, 舒仍亠
于仍舒仆亳从 仂弍'从舒 仄仂亢亠 亰仄仆ミ火委亳
 亠亠仄亠仆仆 仂弍'从 仗仂于仍仆亠 舒弍仂
仆亠仄仂亢仍亳于亠
 仂弍仆亠 仂仂弍仍亳于亠 于亳亟舒仍亠仆仆 (custom
deleter)
亳从仍舒亟 仂弍仍亳于亠 于亳亟舒仍亠仆仆
1 // Interface
2 struct IppDeleter
3 {
4 void operator()(Ipp64f * p) const { ippsFree(p); }
5 };
6
7 using Ipp64fUniquePtr = std::unique_ptr<Ipp64f, IppDeleter>;
8
9 inline Ipp64fUniquePtr makeUniqueIpp64f(int len)
10 {
11 return Ipp64fUniquePtr(ippsMalloc_64f(len));
12 }
13
14 // Usage
15 auto factor = makeUniqueIpp64f(3);
亳从仍舒亟 make_unique (C++14)
1 // Interface
2 void combine(std::unique_ptr<A> && a, std::unique_pr<B> && b);
1 // Usage 1 (exception unsafe because of a possible interleaved order of
2 // execution of subexpressions in function parameters)
3 combine(std::unique_ptr<A>(new A(2)), std::unique_ptr<B>(new B));
4 combine(std::unique_ptr<A>(new A(2)), createB());
1 // Usage 2 (exception safe)
2 combine(std::make_unique<A>(2), std::make_unique<B>());
3 combine(std::make_unique<A>(2), createB());
亳从仍舒亟 make_unique 2 (C++14)
1 // Declaration
2 std::vector<std::unique_ptr<Biscuit>> biscuits;
1 // Usage 1 (line 2 is long; line 3 is exception unsafe: if emplace_back throws)
2 biscuits.push_back(std::unique_ptr<Biscuit>(new Biscuit));
3 biscuits.emplace_back(new Biscuit);
1 // Usage 2 (exception safe)
2 biscuits.push_back(std::make_unique<Biscuit>());
3 biscuits.emplace_back(std::make_unique<Biscuit>());
1 // "Naked" declaration
2 std::vector<Biscuit *> biscuits;
1 // "Naked" usage 1 (exception unsafe)
2 biscuits.push_back(new Biscuit);
1 // "Naked" usage 2 (exception safe)
2 biscuits.push_back(nullptr);
3 biscuits.back() = new Biscuit;
 亊从 仂亟仂
舒仂舒亳于仆亳
从仂仆亠亶仆亠于?
(std::set, std::map,
std::unordered_set
, std::multimap, ...)
std::auto_ptr
 仂仗仆亳亶 于 C++98
 亠 仆亳于仆舒 亠仄舒仆亳从舒 从仂仗ミ火夷出術
 亠 仄仂亢亠 弍亳 于亳从仂亳舒仆亳亶 于 从仂仆亠亶仆亠舒
 Deprecated in C++11
 Removed in C++17
 仂亢亠 弍亳 仍亠亞从仂 亰舒仄仆亠仆亳亶 仆舒 unique_ptr
亳从仍舒亟 从舒亰于仆亳从 仆舒 亠舒仍亰舒
1 // Spacer.h
2 class Spacer
3 {
4 public:
5 Spacer();
6 ~Spacer();
7 // ...
8 private:
9 class Impl;
10 std::unique_ptr<Impl> impl_;
11 };
12
13 // Spacer.cpp
14 class Spacer::Impl
15 {
16 // ...
17 };
18 Spacer::Spacer() : impl_(std::make_unique<Impl>()) {}
19 // Destructor definition must be in the cpp file because the
20 // implicitly invoked Impl's destructor needs complete type
21 Spacer::~Spacer() = default;
弌仗亠舒仍亰舒 亟仍 仄舒亳于于
 舒亰于亳舒亶 std::vector 舒弍仂 std::string 亰仆.
 个仆从, 磻 仆亠 仄仂亢仆舒 亰仄仆亳亳 (弍弍仍仂亠仆舒
仆从), 仗亳亶仄舒/于亠舒 于从舒亰于仆亳从 仆舒 仄舒亳于
 unique_ptr<T[]> 亠亠从亳于仆亳亶 于 亟亠磻亳
亳舒:
 new T[n] 于亳亟仍 仗舒仄' 亟仍 于仆仂 n 亠仍亠仄亠仆于
 new T[n] 仆亠 仆ム 亠仍亠仄亠仆亳, 磻仂 T - POD
 template <class T, class Deleter> class unique_ptr<T[], Deleter>;
舒 亰舒仗亳舒仆仆
Ad

Recommended

JavaScript. Lectures. part 1. basis
JavaScript. Lectures. part 1. basis
仍亠亞 仍亞从亳亶
01 Incapsulation
01 Incapsulation
olegapster
Coding for Future in Lutsk. JavaScript. Part 6
Coding for Future in Lutsk. JavaScript. Part 6
仍亠亞 仍亞从亳亶
Phpunit 仄仂亟仍仆亠 亠于舒仆仆
Phpunit 仄仂亟仍仆亠 亠于舒仆仆
Vladimir Maslechkin
07 Containers
07 Containers
olegapster
08 Functions
08 Functions
olegapster
Clean code (UA)
Clean code (UA)
Oleksandr Pavlyshak
Phpunit
Phpunit
Vladimir Maslechkin
"Unit testing in AngularJS" 亳从仂 仂亰仍磻
"Unit testing in AngularJS" 亳从仂 仂亰仍磻
Fwdays
System programing module 2. Threads
System programing module 2. Threads
Andrii Hladkyi
Asynchronous programming in .NET (UA)
Asynchronous programming in .NET (UA)
Oleksandr Pavlyshak
04 Operators
04 Operators
olegapster
Tdd, 亳 亟亠?
Tdd, 亳 亟亠?
Roman Mazur
06 Pointers To Class Members
06 Pointers To Class Members
olegapster
Theme23-oop2
Theme23-oop2
仍亠亞 仍亞从亳亶
General Functors ...
General Functors ...
Igor Lozynskyi
NET Framework and C# Module 12.2. Garbage Collector
NET Framework and C# Module 12.2. Garbage Collector
Andrii Hladkyi
Prometheus. 舒仂于亳亶 仂仆仍舒亶仆 从 "仆仂于亳 仗仂亞舒仄于舒仆仆". 亠从 5
Prometheus. 舒仂于亳亶 仂仆仍舒亶仆 从 "仆仂于亳 仗仂亞舒仄于舒仆仆". 亠从 5
Nikita Pavliuchenko
2016.05.23 SSCGTHV INFORMA - NOUS LLOCS DE TREBALL
2016.05.23 SSCGTHV INFORMA - NOUS LLOCS DE TREBALL
SSCGTHV VILADECANS
Continuity
Continuity
Angel Wilson
2015.10.27 SSCGTHV - INFORMATIVO PIDE LOS DIAS YA
SSCGTHV VILADECANS
Curso ehrpp
SandraEvangelina
AS GLBSGVOC Exhibitor App. 2016 Autism Acceptance Walk and Resource Fair
AS GLBSGVOC Exhibitor App. 2016 Autism Acceptance Walk and Resource Fair
Regina Moreno
Ecoscope Level 2 cert.
Ecoscope Level 2 cert.
Ekkadit S.
A Novel Methodology for the Separation of Known Suspended Microplastics (&lt;...
A Novel Methodology for the Separation of Known Suspended Microplastics (&lt;...
MACE Lab
La+propiedad+y+la+comunidad
heibercolmenarez
Cuadro+informativo
heibercolmenarez
Perda 14 th 2012 bumd
Perda 14 th 2012 bumd
Alfalaiah Arifin

More Related Content

What's hot (12)

"Unit testing in AngularJS" 亳从仂 仂亰仍磻
"Unit testing in AngularJS" 亳从仂 仂亰仍磻
Fwdays
System programing module 2. Threads
System programing module 2. Threads
Andrii Hladkyi
Asynchronous programming in .NET (UA)
Asynchronous programming in .NET (UA)
Oleksandr Pavlyshak
04 Operators
04 Operators
olegapster
Tdd, 亳 亟亠?
Tdd, 亳 亟亠?
Roman Mazur
06 Pointers To Class Members
06 Pointers To Class Members
olegapster
Theme23-oop2
Theme23-oop2
仍亠亞 仍亞从亳亶
General Functors ...
General Functors ...
Igor Lozynskyi
NET Framework and C# Module 12.2. Garbage Collector
NET Framework and C# Module 12.2. Garbage Collector
Andrii Hladkyi
Prometheus. 舒仂于亳亶 仂仆仍舒亶仆 从 "仆仂于亳 仗仂亞舒仄于舒仆仆". 亠从 5
Prometheus. 舒仂于亳亶 仂仆仍舒亶仆 从 "仆仂于亳 仗仂亞舒仄于舒仆仆". 亠从 5
Nikita Pavliuchenko
"Unit testing in AngularJS" 亳从仂 仂亰仍磻
"Unit testing in AngularJS" 亳从仂 仂亰仍磻
Fwdays
System programing module 2. Threads
System programing module 2. Threads
Andrii Hladkyi
Asynchronous programming in .NET (UA)
Asynchronous programming in .NET (UA)
Oleksandr Pavlyshak
04 Operators
04 Operators
olegapster
Tdd, 亳 亟亠?
Tdd, 亳 亟亠?
Roman Mazur
06 Pointers To Class Members
06 Pointers To Class Members
olegapster
General Functors ...
General Functors ...
Igor Lozynskyi
NET Framework and C# Module 12.2. Garbage Collector
NET Framework and C# Module 12.2. Garbage Collector
Andrii Hladkyi
Prometheus. 舒仂于亳亶 仂仆仍舒亶仆 从 "仆仂于亳 仗仂亞舒仄于舒仆仆". 亠从 5
Prometheus. 舒仂于亳亶 仂仆仍舒亶仆 从 "仆仂于亳 仗仂亞舒仄于舒仆仆". 亠从 5
Nikita Pavliuchenko

Viewers also liked (11)

2016.05.23 SSCGTHV INFORMA - NOUS LLOCS DE TREBALL
2016.05.23 SSCGTHV INFORMA - NOUS LLOCS DE TREBALL
SSCGTHV VILADECANS
Continuity
Continuity
Angel Wilson
2015.10.27 SSCGTHV - INFORMATIVO PIDE LOS DIAS YA
SSCGTHV VILADECANS
Curso ehrpp
SandraEvangelina
AS GLBSGVOC Exhibitor App. 2016 Autism Acceptance Walk and Resource Fair
AS GLBSGVOC Exhibitor App. 2016 Autism Acceptance Walk and Resource Fair
Regina Moreno
Ecoscope Level 2 cert.
Ecoscope Level 2 cert.
Ekkadit S.
A Novel Methodology for the Separation of Known Suspended Microplastics (&lt;...
A Novel Methodology for the Separation of Known Suspended Microplastics (&lt;...
MACE Lab
La+propiedad+y+la+comunidad
heibercolmenarez
Cuadro+informativo
heibercolmenarez
Perda 14 th 2012 bumd
Perda 14 th 2012 bumd
Alfalaiah Arifin
Espacio geogr叩fico y divisi坦n pol鱈tico-territorial
elianah14
2016.05.23 SSCGTHV INFORMA - NOUS LLOCS DE TREBALL
2016.05.23 SSCGTHV INFORMA - NOUS LLOCS DE TREBALL
SSCGTHV VILADECANS
2015.10.27 SSCGTHV - INFORMATIVO PIDE LOS DIAS YA
SSCGTHV VILADECANS
Curso ehrpp
SandraEvangelina
AS GLBSGVOC Exhibitor App. 2016 Autism Acceptance Walk and Resource Fair
AS GLBSGVOC Exhibitor App. 2016 Autism Acceptance Walk and Resource Fair
Regina Moreno
Ecoscope Level 2 cert.
Ecoscope Level 2 cert.
Ekkadit S.
A Novel Methodology for the Separation of Known Suspended Microplastics (&lt;...
A Novel Methodology for the Separation of Known Suspended Microplastics (&lt;...
MACE Lab
La+propiedad+y+la+comunidad
heibercolmenarez
Cuadro+informativo
heibercolmenarez
Espacio geogr叩fico y divisi坦n pol鱈tico-territorial
elianah14
Ad

Similar to IT Talks The c++'s simplest smart pointers in depth (17)

仗亠亠亟舒舒 仗舒舒仄亠于 于 仆从
仗亠亠亟舒舒 仗舒舒仄亠于 于 仆从
ミ莞斜湖姉 仍亞亳仆舒
02 Copying Objects
02 Copying Objects
olegapster
"Is there life in react without redux" by Babich Sergiy. OdessaJS'2021
"Is there life in react without redux" by Babich Sergiy. OdessaJS'2021
OdessaJS Conf
Net framework c# module 15
Net framework c# module 15
Andrii Hladkyi
仂亟仍 Python
仂亟仍 Python
从舒亠亳仆舒 舒亟舒
Funkciji1
Funkciji1
仍亞舒 弍舒从
仆仂于亳 仄仂于亳 Ci
仆仂于亳 仄仂于亳 Ci
Escuela
"How I don't need a state management library in React app", Tetiana Melnyk
"How I don't need a state management library in React app", Tetiana Melnyk
Fwdays
Mka python jr-urok_03_ua_1563258828
Mka python jr-urok_03_ua_1563258828
PavloTsiura
General Functors
General Functors
Dzendzula
Play Mongodb
Play Mongodb
Infinity
仂仄舒仆 弌舒于从亳亶, "Webcomponents & lit-element in production."
仂仄舒仆 弌舒于从亳亶, "Webcomponents & lit-element in production."
Sigma Software
JS Fest 2019/Autumn. 仂仄舒仆 弌舒于从亳亶. Webcomponents & lit-element in production
JS Fest 2019/Autumn. 仂仄舒仆 弌舒于从亳亶. Webcomponents & lit-element in production
JSFestUA
iPhone Objective-C Development (ukr) (2009)
iPhone Objective-C Development (ukr) (2009)
Anatoliy Okhotnikov
07 - vysnovky z tdd, pohliad pochatkivtsia - vitalii zinchenko it event 2013...
07 - vysnovky z tdd, pohliad pochatkivtsia - vitalii zinchenko it event 2013...
Igor Bronovskyy
02 Copying Objects
02 Copying Objects
olegapster
"Is there life in react without redux" by Babich Sergiy. OdessaJS'2021
"Is there life in react without redux" by Babich Sergiy. OdessaJS'2021
OdessaJS Conf
Net framework c# module 15
Net framework c# module 15
Andrii Hladkyi
仆仂于亳 仄仂于亳 Ci
仆仂于亳 仄仂于亳 Ci
Escuela
"How I don't need a state management library in React app", Tetiana Melnyk
"How I don't need a state management library in React app", Tetiana Melnyk
Fwdays
Mka python jr-urok_03_ua_1563258828
Mka python jr-urok_03_ua_1563258828
PavloTsiura
General Functors
General Functors
Dzendzula
Play Mongodb
Play Mongodb
Infinity
仂仄舒仆 弌舒于从亳亶, "Webcomponents & lit-element in production."
仂仄舒仆 弌舒于从亳亶, "Webcomponents & lit-element in production."
Sigma Software
JS Fest 2019/Autumn. 仂仄舒仆 弌舒于从亳亶. Webcomponents & lit-element in production
JS Fest 2019/Autumn. 仂仄舒仆 弌舒于从亳亶. Webcomponents & lit-element in production
JSFestUA
iPhone Objective-C Development (ukr) (2009)
iPhone Objective-C Development (ukr) (2009)
Anatoliy Okhotnikov
07 - vysnovky z tdd, pohliad pochatkivtsia - vitalii zinchenko it event 2013...
07 - vysnovky z tdd, pohliad pochatkivtsia - vitalii zinchenko it event 2013...
Igor Bronovskyy
Ad

More from Vadym Muliavka (11)

Mykhailo Zarai "Be careful when dealing with C++" at Rivne IT Talks
Mykhailo Zarai "Be careful when dealing with C++" at Rivne IT Talks
Vadym Muliavka
Roman Valchuk "Introducing to DevOps technologies"
Roman Valchuk "Introducing to DevOps technologies"
Vadym Muliavka
IT Talks "VR Tips for Engineers and Developers"
IT Talks "VR Tips for Engineers and Developers"
Vadym Muliavka
Rivne IT Talks How to programa Quantum Computer?
Rivne IT Talks How to programa Quantum Computer?
Vadym Muliavka
IT Talks The approach for solving impossible tasks (dynamic programming)
IT Talks The approach for solving impossible tasks (dynamic programming)
Vadym Muliavka
Bug reporting and tracking
Bug reporting and tracking
Vadym Muliavka
Boundary value analysis
Boundary value analysis
Vadym Muliavka
Equivalence partitions analysis
Equivalence partitions analysis
Vadym Muliavka
IT Talks 于仂仄舒亳亰舒 亠于舒仆仆 亰 亟仂仗仂仄仂亞仂 Selenium
IT Talks 于仂仄舒亳亰舒 亠于舒仆仆 亰 亟仂仗仂仄仂亞仂 Selenium
Vadym Muliavka
IT Talks 丐亠于舒仆仆 舒 舒仆舒仍亰 于亳仄仂亞
IT Talks 丐亠于舒仆仆 舒 舒仆舒仍亰 于亳仄仂亞
Vadym Muliavka
IT Talks QA - 磻 仗仂亠于 仂亰仂弍从亳
IT Talks QA - 磻 仗仂亠于 仂亰仂弍从亳
Vadym Muliavka
Mykhailo Zarai "Be careful when dealing with C++" at Rivne IT Talks
Mykhailo Zarai "Be careful when dealing with C++" at Rivne IT Talks
Vadym Muliavka
Roman Valchuk "Introducing to DevOps technologies"
Roman Valchuk "Introducing to DevOps technologies"
Vadym Muliavka
IT Talks "VR Tips for Engineers and Developers"
IT Talks "VR Tips for Engineers and Developers"
Vadym Muliavka
Rivne IT Talks How to programa Quantum Computer?
Rivne IT Talks How to programa Quantum Computer?
Vadym Muliavka
IT Talks The approach for solving impossible tasks (dynamic programming)
IT Talks The approach for solving impossible tasks (dynamic programming)
Vadym Muliavka
Bug reporting and tracking
Bug reporting and tracking
Vadym Muliavka
Boundary value analysis
Boundary value analysis
Vadym Muliavka
Equivalence partitions analysis
Equivalence partitions analysis
Vadym Muliavka
IT Talks 于仂仄舒亳亰舒 亠于舒仆仆 亰 亟仂仗仂仄仂亞仂 Selenium
IT Talks 于仂仄舒亳亰舒 亠于舒仆仆 亰 亟仂仗仂仄仂亞仂 Selenium
Vadym Muliavka
IT Talks 丐亠于舒仆仆 舒 舒仆舒仍亰 于亳仄仂亞
IT Talks 丐亠于舒仆仆 舒 舒仆舒仍亰 于亳仄仂亞
Vadym Muliavka
IT Talks QA - 磻 仗仂亠于 仂亰仂弍从亳
IT Talks QA - 磻 仗仂亠于 仂亰仂弍从亳
Vadym Muliavka

IT Talks The c++'s simplest smart pointers in depth

  • 1. 亠舒仍仆仂 仗仂 仆舒亶仗仂 仂亰仄仆 于从舒亰于仆亳从亳 C++ || The C++'s simplest smart pointers in depth
  • 2. 亠于舒仆仆 仗舒仄' 于 C++ 仆亠 从亠于舒仆仆 仗舒仄' 亳仄舒仆仆 亠 仆舒仍亰舒 == Resource acquisition is initialization == RAII
  • 3. RAII 仂亢亠仆 亠 仂弍亞仂舒 于 从仍舒, 于 磻仂仄: 从仂仆从仂 仂亳仄 亠 于舒仆仂于仍ム 于 仆于舒舒仆亳 从仍舒, 舒弍仂 从亳亟舒 于亳从仍ム亠仆仆, 磻仂 亠 仆亠 于亟舒 亰仂弍亳亳 亟亠从仂 亰于仍仆 亠 仆亠 从亳亟舒 于亳从仍ム亠仆 亠 亰舒于亢亟亳 亰弍亠亞舒 于 仂弍'从 RAII- 从仍舒, 磻亳亶 于仂亠仆亳亶 仆舒 亠从 亳 亳仄舒仂于亳亶, 舒弍仂 仄舒 舒 仆于舒仆仆 仂弍仄亠亢亠仆亳亶 仆亳仄 舒从亳仄 仂弍'从仂仄 亠亰仗亠从舒 于亳仆从仂于亳 亳舒亶 == ES 仂仍亠亞 舒仆仆亶 于亳亟 亰 仆从 亳 亳从仍
  • 4. 亠亠于舒亞亳 RAII 仆舒亟 亰弍亳舒亠仄 仄 (GC) 丕仆仂仄仆亠 从亠于舒仆仆 亠舒仄亳: 仂仗亠舒亳于仆舒 仗舒仄', 仗仂从 (thread), 于亟从亳亳亶 仂从亠, 于亟从亳亳亶 舒亶仍, 亰舒弍仍仂从仂于舒仆亳亶 仄兵ム亠从, 亰'亟仆舒仆仆 亰 亠亠亟弍舒于舒仆亳亶 舒 仆于舒仆仆 仂弍'从舒 弌仄 亠从亳于仆亠 于亳从仂亳舒仆仆 仗舒仄' 亟仆 仆亠从仂仆仂仍仂于舒仆亳 亰舒亳仄仂从 亟仍 于亳亟舒仍亠仆仆 仄
  • 5. 亠亠于舒亞亳 亰弍亳舒舒 仄 仆舒亟 RAII GC 仗仂亠 于亳从仂亳仂于于舒亳 于 仗仂亳 亳舒 GC 亟仂亰于仂仍 亠亠从亳于仆仂 亠舒仍亰于舒亳 亟亠磻 仗仂亶仆 (persistent) 从亳 亟舒仆亳 RAII 于亳仄舒亞舒 亟亳亳仗仍仆亳 仂亰仂弍仆亳从舒 仂亟 弍舒亞舒仂 仗仂亞舒仄 仆舒仗亳舒仆亳亶 仆舒 亟亠于仆仂仄 C++, 舒从仂于仂 仆舒 C 亳亟舒仍亠仆仆 亟于 (UB) 仂亰仄亠仆于舒仆仆 于亳仂亞仂 于从舒亰于仆亳从舒 (UB) 仂从舒仆仆 仗舒仄' 舒于 从仂亠从仆亳亶 从仂亟 从仍舒亟仆仂 仄仂亟亳从于舒亳/亠舒从仂亳亳
  • 6. 亳从仍舒亟 丐亳仄舒仂于亳亶 于从舒亰于仆亳从 1 1 bool showDonut(int windowId) 2 { 3 Painter * const painter = makePainter(windowId); 4 return painter->showDonut(); 5 }
  • 7. 亳从仍舒亟 丐亳仄舒仂于亳亶 于从舒亰于仆亳从 2 1 bool showDonut(int windowId) 2 { 3 Painter * const painter = makePainter(windowId); 4 const bool result = painter->showDonut(); 5 delete painter; 6 return result; 7 }
  • 8. 亳从仍舒亟 丐亳仄舒仂于亳亶 于从舒亰于仆亳从 3 1 bool showDonut(int windowId) 2 { 3 Painter * const painter = makePainter(windowId); 4 if (!painter->hasKitchen()) 5 return false; 6 const bool result = painter->showDonut(); 7 delete painter; 8 return result; 9 }
  • 9. 亳从仍舒亟 丐亳仄舒仂于亳亶 于从舒亰于仆亳从 4 1 bool showDonut(int windowId) 2 { 3 Painter * const painter = makePainter(windowId); 4 if (!painter->hasKitchen()) { 5 delete painter; 6 return false; 7 } 8 const bool result = painter->showDonut(); 9 delete painter; 10 return result; 11 }
  • 10. 亳从仍舒亟 丐亳仄舒仂于亳亶 于从舒亰于仆亳从 5 1 bool showDonut(int windowId) 2 { 3 Painter * const painter = makePainter(windowId); 4 try { 5 if (!painter->hasKitchen()) { 6 delete painter; 7 return false; 8 } 9 const bool result = painter->showDonut(); 10 delete painter; 11 return result; 12 } 13 catch (...) { 14 delete painter; 15 throw; 16 } 17 }
  • 11. 亳从仍舒亟 丐亳仄舒仂于亳亶 于从舒亰于仆亳从 6 1 bool showDonut(int windowId) 2 { 3 Painter * const painter = makePainter(windowId); 4 try { 5 Kitchen * const kitchen = painter->makeKitchen(); 6 if (!kitchen) { 7 delete painter; 8 return false; 9 } 10 const bool result = kitchen->showDonut(); 11 delete kitchen; 12 delete painter; 13 return result; 14 } 15 catch (...) { 16 delete painter; 17 throw; 18 } 19 }
  • 12. 亳从仍舒亟 丐亳仄舒仂于亳亶 于从舒亰于仆亳从 7 1 bool showDonut(int windowId) 2 { 3 Painter * const painter = makePainter(windowId); 4 Kitchen * kitchen = nullptr; 5 try { 6 kitchen = painter->makeKitchen(); 7 if (!kitchen) { 8 delete painter; 9 return false; 10 } 11 const bool result = kitchen->showDonut(); 12 delete kitchen; 13 delete painter; 14 return result; 15 } 16 catch (...) { 17 delete kitchen; 18 delete painter; 19 throw; 20 } 21 }
  • 13. 亳从仍舒亟 丐亳仄舒仂于亳亶 于从舒亰于仆亳从 2 1 bool showDonut(int windowId) 2 { 3 Painter * const painter = makePainter(windowId); 4 const bool result = painter->showDonut(); 5 delete painter; 6 return result; 7 } 1 bool showDonut(int windowId) 2 { 3 using Ptr = const std::unique_ptr<Painter>; 4 Ptr painter(makePainter(windowId)); 5 return painter->showDonut(); 6 }
  • 14. 亳从仍舒亟 丐亳仄舒仂于亳亶 于从舒亰于仆亳从 4 1 bool showDonut(int windowId) 2 { 3 Painter * const painter = makePainter(windowId); 4 if (!painter->hasKitchen()) { 5 delete painter; 6 return false; 7 } 8 const bool result = painter->showDonut(); 9 delete painter; 10 return result; 11 } 1 bool showDonut(int windowId) 2 { 3 using Ptr = const std::unique_ptr<Painter>; 4 Ptr painter(makePainter(windowId)); 5 if (!painter->hasKitchen()) 6 return false; 7 return painter->showDonut(); 8 }
  • 15. 亳从仍舒亟 丐亳仄舒仂于亳亶 于从舒亰于仆亳从 5 1 bool showDonut(int windowId) 2 { 3 Painter * const painter = makePainter(windowId); 4 try { 5 if (!painter->hasKitchen()) { 6 delete painter; 7 return false; 8 } 9 const bool result = painter->showDonut(); 10 delete painter; 11 return result; 12 } 13 catch (...) { 14 delete painter; 15 throw; 16 } 17 } 1 bool showDonut(int windowId) 2 { 3 using Ptr = const std::unique_ptr<Painter>; 4 Ptr painter(makePainter(windowId)); 5 if (!painter->hasKitchen()) 6 return false; 7 return painter->showDonut(); 8 }
  • 16. 亳从仍舒亟 丐亳仄舒仂于亳亶 于从舒亰于仆亳从 7 1 bool showDonut(int windowId) 2 { 3 Painter * const painter = makePainter(windowId); 4 Kitchen * kitchen = nullptr; 5 try { 6 kitchen = painter->makeKitchen(); 7 if (!kitchen) { 8 delete painter; 9 return false; 10 } 11 const bool result = kitchen->showDonut(); 12 delete kitchen; 13 delete painter; 14 return result; 15 } 16 catch (...) { 17 delete kitchen; 18 delete painter; 19 throw; 20 } 21 } 1 bool showDonut(int windowId) 2 { 3 using Ptr = const std::unique_ptr<Painter>; 4 Ptr painter(makePainter(windowId)); 5 using Kptr = const std::unique_ptr<Kitchen>; 6 Kptr kitchen(painter->makeKitchen()); 7 if (!kitchen) 8 return false; 9 return kitchen->showDonut(); 10 }
  • 17. 亳从仍舒亟 仆亠亠亶 1 1 // Interface 1 2 Cookie * makeCookie(int size); 3 bool showCookie(Cookie * cookie); 4 5 // Interface 2 6 Cookie * getCookie(int size); 7 bool eatCookie(Cookie * cookie);
  • 18. 亳从仍舒亟 仆亠亠亶 2 1 // Interface 1 2 Cookie * makeCookie(int size); 3 bool showCookie(Cookie & cookie); 4 5 // Interface 2 6 Cookie & getCookie(int size); 7 bool eatCookie(Cookie * cookie); 1 // Interface 1 2 Cookie * makeCookie(int size); 3 bool showCookie(Cookie * cookie); 4 5 // Interface 2 6 Cookie * getCookie(int size); 7 bool eatCookie(Cookie * cookie);
  • 19. 亳从仍舒亟 仆亠亠亶 3 1 // Interface 1 2 Cookie * makeCookie(int size); 3 bool showCookie(Cookie * cookie); 4 5 // Interface 2 6 Cookie * getCookie(int size); 7 bool eatCookie(Cookie * cookie); 1 // Interface 1 2 std::unique_ptr<Cookie> makeCookie(int size); 3 bool showCookie(Cookie * cookie); 4 5 // Interface 2 6 Cookie * getCookie(int size); 7 bool eatCookie(std::unique_ptr<Cookie> && cookie);
  • 20. 亳从仍舒亟 仆亠亠亶 4 1 // Interface 1 2 std::unique_ptr<Cookie> makeCookie(int size); 3 bool showCookie(std::observer_ptr<Cookie> cookie); 4 // std::observer_ptr may land in C++2x 5 // Interface 2 6 std::observer_ptr<Cookie> getCookie(int size); 7 bool eatCookie(std::unique_ptr<Cookie> && cookie); 1 // Interface 1 2 std::unique_ptr<Cookie> makeCookie(int size); 3 bool showCookie(Cookie * cookie); 4 5 // Interface 2 6 Cookie * getCookie(int size); 7 bool eatCookie(std::unique_ptr<Cookie> && cookie);
  • 21. 亳从仍舒亟 仂亳于舒 3 2 std::unique_ptr<Cookie> makeCookie(int size); 7 bool eatCookie(std::unique_ptr<Cookie> && cookie); 1 auto cookie = makeCookie(47); 2 cookie->coverWithCream(); 3 if (eatCookie(std::move(cookie))) 4 std::cout << "Yum!n";
  • 22. 亳从仍舒亟 仂亳于舒 1 2 Cookie * makeCookie(int size); 7 bool eatCookie(Cookie * cookie); 1 auto * cookie = makeCookie(47); 2 try { 3 cookie->coverWithCream(); 4 } 5 catch (...) { 6 delete cookie; 7 throw; 8 } 9 if (eatCookie(cookie)) { 10 std::cout << "Yum!n"; 11 cookie = nullptr; 12 } 13 else 14 delete cookie;
  • 23. 亠从亳于仆 unique_ptr 亠舒仍亰舒 unique_ptr 于亳从仂亳仂于 Empty base optimization (EBO) 仂亢仆舒 仂仗亠舒 仆舒亟 unique_ptr 亠仂亠亳仆仂 仗仂于亳仆仆舒 弍亳 舒从仂 亢 于亳亟从仂, 磻 于亟仗仂于亟仆舒 仂仗亠舒 仆舒亟 亞仂仍亳仄 于从舒亰于仆亳从仂仄 template <class T, class Deleter = std::default_delete<T>> class unique_ptr; sizeof(std::unique_ptr<T, Deleter>) == sizeof(T *) // (磻仂 Deleter 仗仂仂亢仆亶 从仍舒)
  • 24. unique_ptr 亳 亠从? 舒仂 仂亞仂仍仂于舒亳 仂弍'从亳 仆舒 亠从 仆从 舒 亰舒 亰仆舒亠仆仆礆 从仍舒舒 从仂仍亳 亠 仄仂亢仍亳于仂: 于弍亟仂于舒仆 亳仗亳, 从仍舒亳 舒仆亟舒仆仂 弍弍仍仂亠从亳, 仆 仗仂 从亳 舒 从仍舒亳. 丶亠 仗仂亠 亠亠从亳于仆亠. 仂仍仄仂仆亳亶 仂弍'从 从舒亰于仆亳从 仆舒 亠舒仍亰舒 (从仍舒) == Pointer to implementation == Pimpl idiom == Opaque pointer
  • 25. unique_ptr 亳 亠从? (2) 仂弍亠仆 舒仆 于亟仆仂 - nullptr (从舒亠 std::optional 亰 C++17) 亟亠舒 仂弍'从舒 仗仂于亳仆仆舒 弍亳 舒仍仂, 舒仍亠 于仍舒仆亳从 仂弍'从舒 仄仂亢亠 亰仄仆ミ火委亳 亠亠仄亠仆仆 仂弍'从 仗仂于仍仆亠 舒弍仂 仆亠仄仂亢仍亳于亠 仂弍仆亠 仂仂弍仍亳于亠 于亳亟舒仍亠仆仆 (custom deleter)
  • 26. 亳从仍舒亟 仂弍仍亳于亠 于亳亟舒仍亠仆仆 1 // Interface 2 struct IppDeleter 3 { 4 void operator()(Ipp64f * p) const { ippsFree(p); } 5 }; 6 7 using Ipp64fUniquePtr = std::unique_ptr<Ipp64f, IppDeleter>; 8 9 inline Ipp64fUniquePtr makeUniqueIpp64f(int len) 10 { 11 return Ipp64fUniquePtr(ippsMalloc_64f(len)); 12 } 13 14 // Usage 15 auto factor = makeUniqueIpp64f(3);
  • 27. 亳从仍舒亟 make_unique (C++14) 1 // Interface 2 void combine(std::unique_ptr<A> && a, std::unique_pr<B> && b); 1 // Usage 1 (exception unsafe because of a possible interleaved order of 2 // execution of subexpressions in function parameters) 3 combine(std::unique_ptr<A>(new A(2)), std::unique_ptr<B>(new B)); 4 combine(std::unique_ptr<A>(new A(2)), createB()); 1 // Usage 2 (exception safe) 2 combine(std::make_unique<A>(2), std::make_unique<B>()); 3 combine(std::make_unique<A>(2), createB());
  • 28. 亳从仍舒亟 make_unique 2 (C++14) 1 // Declaration 2 std::vector<std::unique_ptr<Biscuit>> biscuits; 1 // Usage 1 (line 2 is long; line 3 is exception unsafe: if emplace_back throws) 2 biscuits.push_back(std::unique_ptr<Biscuit>(new Biscuit)); 3 biscuits.emplace_back(new Biscuit); 1 // Usage 2 (exception safe) 2 biscuits.push_back(std::make_unique<Biscuit>()); 3 biscuits.emplace_back(std::make_unique<Biscuit>()); 1 // "Naked" declaration 2 std::vector<Biscuit *> biscuits; 1 // "Naked" usage 1 (exception unsafe) 2 biscuits.push_back(new Biscuit); 1 // "Naked" usage 2 (exception safe) 2 biscuits.push_back(nullptr); 3 biscuits.back() = new Biscuit; 亊从 仂亟仂 舒仂舒亳于仆亳 从仂仆亠亶仆亠于? (std::set, std::map, std::unordered_set , std::multimap, ...)
  • 29. std::auto_ptr 仂仗仆亳亶 于 C++98 亠 仆亳于仆舒 亠仄舒仆亳从舒 从仂仗ミ火夷出術 亠 仄仂亢亠 弍亳 于亳从仂亳舒仆亳亶 于 从仂仆亠亶仆亠舒 Deprecated in C++11 Removed in C++17 仂亢亠 弍亳 仍亠亞从仂 亰舒仄仆亠仆亳亶 仆舒 unique_ptr
  • 30. 亳从仍舒亟 从舒亰于仆亳从 仆舒 亠舒仍亰舒 1 // Spacer.h 2 class Spacer 3 { 4 public: 5 Spacer(); 6 ~Spacer(); 7 // ... 8 private: 9 class Impl; 10 std::unique_ptr<Impl> impl_; 11 }; 12 13 // Spacer.cpp 14 class Spacer::Impl 15 { 16 // ... 17 }; 18 Spacer::Spacer() : impl_(std::make_unique<Impl>()) {} 19 // Destructor definition must be in the cpp file because the 20 // implicitly invoked Impl's destructor needs complete type 21 Spacer::~Spacer() = default;
  • 31. 弌仗亠舒仍亰舒 亟仍 仄舒亳于于 舒亰于亳舒亶 std::vector 舒弍仂 std::string 亰仆. 个仆从, 磻 仆亠 仄仂亢仆舒 亰仄仆亳亳 (弍弍仍仂亠仆舒 仆从), 仗亳亶仄舒/于亠舒 于从舒亰于仆亳从 仆舒 仄舒亳于 unique_ptr<T[]> 亠亠从亳于仆亳亶 于 亟亠磻亳 亳舒: new T[n] 于亳亟仍 仗舒仄' 亟仍 于仆仂 n 亠仍亠仄亠仆于 new T[n] 仆亠 仆ム 亠仍亠仄亠仆亳, 磻仂 T - POD template <class T, class Deleter> class unique_ptr<T[], Deleter>;