-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathatom.xml
More file actions
517 lines (449 loc) · 384 KB
/
atom.xml
File metadata and controls
517 lines (449 loc) · 384 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<title>deyituo - Gogogo</title>
<link href="/atom.xml" rel="self"/>
<link href="http://deyituo.github.io/"/>
<updated>2016-06-15T04:16:53.000Z</updated>
<id>http://deyituo.github.io/</id>
<author>
<name>Deyi Tuo</name>
</author>
<generator uri="http://hexo.io/">Hexo</generator>
<entry>
<title>scoped_ptr类模版</title>
<link href="http://deyituo.github.io/2016/06/14/scoped-ptr%E7%B1%BB%E6%A8%A1%E7%89%88/"/>
<id>http://deyituo.github.io/2016/06/14/scoped-ptr类模版/</id>
<published>2016-06-14T02:07:06.000Z</published>
<updated>2016-06-15T04:16:53.000Z</updated>
<content type="html"><blockquote>
<p>&#x6700;&#x8FD1;&#x5728;&#x770B;&#x9648;&#x7855;&#x7684;&#x300A;Linux&#x591A;&#x7EBF;&#x7A0B;&#x670D;&#x52A1;&#x7AEF;&#x7F16;&#x7A0B;&#xFF1A;&#x4F7F;&#x7528;muduo C++&#x7F51;&#x7EDC;&#x5E93;&#x300B;&#xFF0C;&#x7B2C;&#x4E00;&#x7AE0;&#x4E2D;&#x91CD;&#x70B9;&#x8BB2;&#x4E86;&#x591A;&#x7EBF;&#x7A0B;&#x4E0B;&#x6307;&#x9488;&#x7684;&#x5904;&#x7406;&#x95EE;&#x9898;&#xFF0C;&#x5176;&#x4E2D;&#x91CD;&#x70B9;&#x662F; shared_ptr &#x4E0E; weak_ptr, &#x5176;&#x4E2D;&#x8FD8;&#x63D0;&#x5230;&#x5728;&#x5185;&#x5B58;&#x6CC4;&#x9732;&#x548C;&#x91CD;&#x590D;&#x91CA;&#x653E;&#x4E2D;&#x4F7F;&#x7528; scoped_ptr&#x3002; &#x4E0A;&#x4E09;&#x7BC7;&#x5B66;&#x4E60;&#x4E86; shared_ptr &#x7684;&#x57FA;&#x672C;&#x7528;&#x6CD5; ( <a href="/2016/06/09/shared-ptr&#x7C7B;&#x6A21;&#x7248;/">shared_ptr&#x7C7B;&#x6A21;&#x7248;</a> ,<a href="/2016/06/12/shared-ptr&#x7C7B;&#x6A21;&#x7248;-2/">shared_ptr&#x7C7B;&#x6A21;&#x677F;(2)</a>) &#x548C; weak_ptr &#x7684;&#x57FA;&#x672C;&#x7528;&#x6CD5; ( <a href="/2016/06/11/weak-ptr&#x7C7B;&#x6A21;&#x7248;/">waek_ptr&#x7C7B;&#x6A21;&#x7248;</a> ) &#xFF0C;&#x4ECA;&#x5929;&#x7EE7;&#x7EED;&#x5B66;&#x4E60; scoped_ptr &#xFF0C;&#x4EE5;&#x4E0B;&#x662F;&#x5BF9; <a href="http://www.boost.org/doc/libs/1_61_0/libs/smart_ptr/scoped_ptr.htm" target="_blank" rel="external">scoped_ptr class template</a> &#x7684;&#x90E8;&#x5206;&#x4E2D;&#x6587;&#x7FFB;&#x8BD1;&#x3002;</p>
</blockquote>
<a id="more"></a>
<h2 id="&#x57FA;&#x672C;&#x7528;&#x6CD5;"><a href="#&#x57FA;&#x672C;&#x7528;&#x6CD5;" class="headerlink" title="&#x57FA;&#x672C;&#x7528;&#x6CD5;"></a>&#x57FA;&#x672C;&#x7528;&#x6CD5;</h2><h3 id="&#x4FDD;&#x8BC1;&#x9500;&#x6BC1;"><a href="#&#x4FDD;&#x8BC1;&#x9500;&#x6BC1;" class="headerlink" title="&#x4FDD;&#x8BC1;&#x9500;&#x6BC1;"></a>&#x4FDD;&#x8BC1;&#x9500;&#x6BC1;</h3><p>scoped_ptr &#x4FDD;&#x5B58;&#x4E86;&#x52A8;&#x6001;&#x5206;&#x914D;&#x5BF9;&#x8C61;&#x7684;&#x6307;&#x9488; (C++ &#x7684; new &#x64CD;&#x4F5C;&#x7B26;)&#x3002;&#x5F53; scoped_ptr &#x88AB;&#x6790;&#x6784;&#x6216;&#x8005; reset &#x7684;&#x65F6;&#x5019;&#xFF0C;&#x88AB;&#x6307;&#x5411;&#x7684;&#x5BF9;&#x8C61;&#x4FDD;&#x8BC1;&#x88AB;&#x9500;&#x6BC1;&#x3002;</p>
<h3 id="&#x4E0D;&#x53EF;&#x590D;&#x5236;"><a href="#&#x4E0D;&#x53EF;&#x590D;&#x5236;" class="headerlink" title="&#x4E0D;&#x53EF;&#x590D;&#x5236;"></a>&#x4E0D;&#x53EF;&#x590D;&#x5236;</h3><p>scoped_ptr &#x6A21;&#x7248;&#x63D0;&#x4F9B;&#x4E86;&#x57FA;&#x672C;&#x7684;&#x201C;&#x8D44;&#x6E90;&#x53EA;&#x9700;&#x8981;&#x521D;&#x59CB;&#x5316;&#x201D;&#x7684;&#x673A;&#x5236;&#xFF0C;&#x6CA1;&#x6709;&#x5171;&#x4EAB;&#x6240;&#x6709;&#x6743;&#x6216;&#x8005;&#x4F20;&#x9012;&#x6240;&#x6709;&#x6743;&#x7684;&#x8BED;&#x4E49;&#xFF0C;&#x53EA;&#x662F;&#x5728;&#x5F53;&#x524D;&#x7684;&#x8303;&#x56F4;&#x4FDD;&#x7559;&#x6240;&#x6709;&#x6743; (<a href="http://www.boost.org/doc/libs/1_61_0/libs/utility/utility.htm#Class_noncopyable" target="_blank" rel="external">noncopyable</a>)&#xFF0C;&#x56E0;&#x4E3A;&#x5B83;&#x4E0D;&#x80FD;&#x62F7;&#x8D1D;&#xFF0C;&#x6240;&#x4EE5;&#x5BF9;&#x4E8E;&#x4E0D;&#x5E94;&#x8BE5;&#x88AB;&#x590D;&#x5236;&#x7684;&#x6307;&#x9488;&#xFF0C;&#x6BD4; shared_ptr &#x6216;&#x8005; std::auto_ptr &#x8981;&#x5B89;&#x5168;&#x3002;</p>
<h3 id="&#x6548;&#x7387;&#x4E0E;&#x7A7A;&#x95F4;"><a href="#&#x6548;&#x7387;&#x4E0E;&#x7A7A;&#x95F4;" class="headerlink" title="&#x6548;&#x7387;&#x4E0E;&#x7A7A;&#x95F4;"></a>&#x6548;&#x7387;&#x4E0E;&#x7A7A;&#x95F4;</h3><p>&#x56E0;&#x4E3A; scoped_ptr &#x662F;&#x7B80;&#x5355;&#x7684;&#xFF0C;&#x5B83;&#x7684;&#x64CD;&#x4F5C;&#x4E0E;&#x5185;&#x7F6E;&#x7684;&#x6307;&#x9488;&#x4E00;&#x6837;&#x5FEB;&#xFF0C;&#x5360;&#x636E;&#x7684;&#x7A7A;&#x95F4;&#x4E5F;&#x4E0D;&#x591A;&#x3002;</p>
<h3 id="scoped-ptr-&#x4E0E;-C-&#x6807;&#x51C6;&#x5E93;"><a href="#scoped-ptr-&#x4E0E;-C-&#x6807;&#x51C6;&#x5E93;" class="headerlink" title="scoped_ptr &#x4E0E; C++ &#x6807;&#x51C6;&#x5E93;"></a>scoped_ptr &#x4E0E; C++ &#x6807;&#x51C6;&#x5E93;</h3><p>scoped_ptr &#x4E0D;&#x80FD;&#x7528;&#x5728; C++ &#x6807;&#x51C6;&#x5E93;&#x5BB9;&#x5668;&#x4E2D;&#xFF0C;&#x8BF7;&#x4F7F;&#x7528;&#x9700;&#x8981;&#x9700;&#x8981;&#x667A;&#x80FD;&#x6307;&#x9488;&#x6765;&#x7528;&#x4E8E;&#x5BB9;&#x5668;&#xFF0C;&#x8BF7;&#x4F7F;&#x7528; <a href="http://www.boost.org/doc/libs/1_61_0/libs/smart_ptr/shared_ptr.htm" target="_blank" rel="external">shared_ptr</a>&#x3002;</p>
<h3 id="&#x6570;&#x7EC4;&#x6307;&#x9488;"><a href="#&#x6570;&#x7EC4;&#x6307;&#x9488;" class="headerlink" title="&#x6570;&#x7EC4;&#x6307;&#x9488;"></a>&#x6570;&#x7EC4;&#x6307;&#x9488;</h3><p>scoped_ptr &#x4E0D;&#x80FD;&#x6B63;&#x786E;&#x5730;&#x4FDD;&#x5B58;&#x52A8;&#x6001;&#x5206;&#x914D;&#x7684;&#x6570;&#x7EC4;&#x7684;&#x6307;&#x9488;&#x3002;<a href="http://www.boost.org/doc/libs/1_61_0/libs/smart_ptr/scoped_array.htm" target="_blank" rel="external">scoped_array</a> &#x63D0;&#x4F9B;&#x4E86;&#x8FD9;&#x7528;&#x9014;&#x3002;</p>
<h3 id="T-&#x7684;&#x8981;&#x6C42;"><a href="#T-&#x7684;&#x8981;&#x6C42;" class="headerlink" title="T &#x7684;&#x8981;&#x6C42;"></a>T &#x7684;&#x8981;&#x6C42;</h3><p>scoped_ptr &#x7684;&#x6A21;&#x7248;&#x53C2;&#x6570; T &#x662F;&#x6307;&#x5411;&#x5BF9;&#x8C61;&#x7684;&#x7C7B;&#x578B;&#xFF0C;&#x9700;&#x8981;&#x6EE1;&#x8DB3;&#x667A;&#x80FD;&#x6307;&#x9488;&#x7684; <a href="http://www.boost.org/doc/libs/1_61_0/libs/smart_ptr/smart_ptr.htm#common_requirements" target="_blank" rel="external"><strong>&#x901A;&#x5E38;&#x8981;&#x6C42;</strong></a>&#xFF1A;</p>
<blockquote>
<p>&#x8FD9;&#x4E9B;&#x667A;&#x80FD;&#x6307;&#x9488;&#x7C7B;&#x6A21;&#x7248;&#x7531;&#x4E00;&#x4E2A;&#x6A21;&#x7248;&#x53C2;&#x6570; T , &#x6307;&#x5B9A;&#x4E86;&#x88AB;&#x667A;&#x80FD;&#x6307;&#x9488;&#x6307;&#x5411;&#x7684;&#x5BF9;&#x8C61;&#x7684;&#x7C7B;&#x578B;&#x3002;&#x5982;&#x679C; T &#x7C7B;&#x578B;&#x5BF9;&#x8C61;&#x7684; <strong>&#x6790;&#x6784;&#x51FD;&#x6570;</strong> &#x6216;&#x8005; <strong> operator delete</strong> &#x629B;&#x51FA;&#x5F02;&#x5E38;&#xFF0C;&#x90A3;&#x4E48;&#x667A;&#x80FD;&#x6307;&#x9488;&#x6A21;&#x7248;&#x7684;&#x884C;&#x4E3A;&#x65E0;&#x5B9A;&#x4E49;&#x3002;<br>&#x5728;&#x667A;&#x80FD;&#x6307;&#x9488;&#x58F0;&#x660E;&#x7684;&#x65F6;&#x5019;&#xFF0C;T &#x53EF;&#x80FD;&#x662F;&#x4E0D;&#x5B8C;&#x6574;&#x7C7B;&#x578B;&#x3002;&#x9664;&#x975E;&#x7279;&#x522B;&#x8BF4;&#x660E;&#xFF0C;&#x5F53;&#x667A;&#x80FD;&#x6307;&#x9488;&#x5B9E;&#x4F8B;&#x5316;&#x7684;&#x65F6;&#x5019;&#xFF0C;&#x9700;&#x8981; T &#x662F;&#x5B8C;&#x6574;&#x7C7B;&#x578B;&#x3002;&#x5B9E;&#x73B0;&#x9700;&#x8981;&#x68C0;&#x67E5;&#x6240;&#x6709;&#x8FDD;&#x53CD;&#x8BE5;&#x9700;&#x6C42;&#x7684;&#x60C5;&#x51B5;&#xFF0C;&#x5305;&#x62EC;&#x4E0D;&#x5B8C;&#x6574;&#x7C7B;&#x578B;&#x7684;&#x9500;&#x6BC1;&#x64CD;&#x4F5C;&#x3002;&#xFF0D;&gt;&#x67E5;&#x770B; [checked delete] &#x51FD;&#x6570;&#x6A21;&#x7248;&#x7684;&#x63CF;&#x8FF0;&#x3002;<br>&#x6CE8;&#x610F; shared_ptr &#x6CA1;&#x6709;&#x8FD9;&#x4E2A;&#x9650;&#x5236;&#xFF0C;&#x56E0;&#x4E3A;&#x5B83;&#x7684;&#x5927;&#x591A;&#x6570;&#x6210;&#x5458;&#x51FD;&#x6570;&#x4E0D;&#x9700;&#x8981; T &#x662F;&#x5B8C;&#x6574;&#x7C7B;&#x578B;&#x3002;<br>&#x6CE8;&#x610F;&#x6790;&#x6784;&#x65F6;&#xFF0C;scoped_ptr &#x9700;&#x8981; T &#x662F;&#x5B8C;&#x6574;&#x7C7B;&#x578B;&#xFF0C;&#x800C; shared_ptr &#x4E0D;&#x9700;&#x8981;&#x3002;</p>
</blockquote>
<h2 id="Synopsis"><a href="#Synopsis" class="headerlink" title="Synopsis"></a>Synopsis</h2><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">namespace</span> boost {</span><br><span class="line"></span><br><span class="line"> <span class="keyword">template</span>&lt;<span class="keyword">class</span> T&gt; <span class="keyword">class</span> scoped_ptr : noncopyable {</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span>:</span><br><span class="line"> <span class="keyword">typedef</span> T element_type;</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">explicit</span> <span class="title">scoped_ptr</span><span class="params">(T * p = <span class="number">0</span>)</span></span>; <span class="comment">// never throws</span></span><br><span class="line"> ~scoped_ptr(); <span class="comment">// never throws</span></span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">void</span> <span class="title">reset</span><span class="params">(T * p = <span class="number">0</span>)</span></span>; <span class="comment">// never throws</span></span><br><span class="line"></span><br><span class="line"> T &amp; <span class="keyword">operator</span>*() <span class="keyword">const</span>; <span class="comment">// never throws</span></span><br><span class="line"> T * <span class="keyword">operator</span>-&gt;() <span class="keyword">const</span>; <span class="comment">// never throws</span></span><br><span class="line"> <span class="function">T * <span class="title">get</span><span class="params">()</span> <span class="keyword">const</span></span>; <span class="comment">// never throws</span></span><br><span class="line"> </span><br><span class="line"> <span class="keyword">operator</span> unspecified-<span class="keyword">bool</span>-type() <span class="keyword">const</span>; <span class="comment">// never throws</span></span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">void</span> <span class="title">swap</span><span class="params">(scoped_ptr &amp; b)</span></span>; <span class="comment">// never throws</span></span><br><span class="line"> };</span><br><span class="line"></span><br><span class="line"> <span class="keyword">template</span>&lt;<span class="keyword">class</span> T&gt; <span class="function"><span class="keyword">void</span> <span class="title">swap</span><span class="params">(scoped_ptr&lt;T&gt; &amp; a, scoped_ptr&lt;T&gt; &amp; b)</span></span>; <span class="comment">// never throws</span></span><br><span class="line"></span><br><span class="line">}</span><br></pre></td></tr></table></figure>
<h2 id="Members"><a href="#Members" class="headerlink" title="Members"></a>Members</h2><h3 id="element-type"><a href="#element-type" class="headerlink" title="element_type"></a>element_type</h3><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">typedef</span> T element_type;</span><br></pre></td></tr></table></figure>
<p>&#x5B58;&#x50A8;&#x6307;&#x9488;&#x7684;&#x7C7B;&#x578B;&#x3002;</p>
<h3 id="&#x6784;&#x9020;&#x51FD;&#x6570;"><a href="#&#x6784;&#x9020;&#x51FD;&#x6570;" class="headerlink" title="&#x6784;&#x9020;&#x51FD;&#x6570;"></a>&#x6784;&#x9020;&#x51FD;&#x6570;</h3><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">explicit</span> <span class="title">scoped_ptr</span><span class="params">(T * p = <span class="number">0</span>)</span></span>; <span class="comment">// never throws</span></span><br></pre></td></tr></table></figure>
<p>&#x6784;&#x5EFA;&#x4E00;&#x4E2A; scopeda_ptr, &#x5B58;&#x50A8;&#x4E86; p &#x7684;&#x62F7;&#x8D1D; (p &#x5FC5;&#x987B;&#x7531; new &#x8868;&#x8FBE;&#x5F0F;&#x5206;&#x914D;&#x6216;&#x8005;&#x4E3A; 0)&#x3002;T &#x4E0D;&#x9700;&#x8981;&#x662F;&#x5B8C;&#x6574;&#x7C7B;&#x578B;&#xFF0C;&#x770B;&#x667A;&#x80FD;&#x6307;&#x9488;&#x7684; <a href="http://www.boost.org/doc/libs/1_61_0/libs/smart_ptr/smart_ptr.htm#common_requirements" target="_blank" rel="external"><strong>&#x901A;&#x5E38;&#x8981;&#x6C42;</strong></a>&#x3002;</p>
<h3 id="&#x6790;&#x6784;&#x51FD;&#x6570;"><a href="#&#x6790;&#x6784;&#x51FD;&#x6570;" class="headerlink" title="&#x6790;&#x6784;&#x51FD;&#x6570;"></a>&#x6790;&#x6784;&#x51FD;&#x6570;</h3><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">~scoped_ptr(); <span class="comment">// never throws</span></span><br></pre></td></tr></table></figure>
<p>&#x6790;&#x6784;&#x4FDD;&#x5B58;&#x7684;&#x6307;&#x9488;&#x6307;&#x5411;&#x7684;&#x5BF9;&#x8C61;&#xFF0C;&#x548C; delete this-&gt;get() &#x6548;&#x679C;&#x4E00;&#x6837;&#x3002;</p>
<p>&#x4E0D;&#x629B;&#x51FA;&#x5F02;&#x5E38;&#x4F7F;&#x7528;&#x4E86; delete &#x5BF9;&#x8C61;&#x65F6;&#x4E0D;&#x629B;&#x51FA;&#x5F02;&#x5E38;&#x7684;&#x8981;&#x6C42;&#x3002;&#x770B;&#x667A;&#x80FD;&#x6307;&#x9488;&#x7684; <a href="http://www.boost.org/doc/libs/1_61_0/libs/smart_ptr/smart_ptr.htm#common_requirements" target="_blank" rel="external"><strong>&#x901A;&#x5E38;&#x8981;&#x6C42;</strong></a>&#x3002;</p>
<h3 id="reset"><a href="#reset" class="headerlink" title="reset"></a>reset</h3><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">reset</span><span class="params">(T * p = <span class="number">0</span>)</span></span>; <span class="comment">// never throws</span></span><br></pre></td></tr></table></figure>
<p>&#x6790;&#x6784;&#x4FDD;&#x5B58;&#x7684;&#x6307;&#x9488;&#x6307;&#x5411;&#x7684;&#x5BF9;&#x8C61;&#xFF0C;&#x518D;&#x4FDD;&#x5B58; p &#x7684;&#x62F7;&#x8D1D; (p &#x5FC5;&#x987B;&#x7531; new &#x8868;&#x8FBE;&#x5F0F;&#x5206;&#x914D;&#x6216;&#x8005;&#x4E3A; 0)&#x3002;&#x4E0D;&#x629B;&#x51FA;&#x5F02;&#x5E38;&#x4F7F;&#x7528;&#x4E86; delete &#x5BF9;&#x8C61;&#x65F6;&#x4E0D;&#x629B;&#x51FA;&#x5F02;&#x5E38;&#x7684;&#x8981;&#x6C42;&#x3002;&#x770B;&#x667A;&#x80FD;&#x6307;&#x9488;&#x7684; <a href="http://www.boost.org/doc/libs/1_61_0/libs/smart_ptr/smart_ptr.htm#common_requirements" target="_blank" rel="external"><strong>&#x901A;&#x5E38;&#x8981;&#x6C42;</strong></a>&#x3002;</p>
<h3 id="indirection"><a href="#indirection" class="headerlink" title="indirection"></a>indirection</h3><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">T &amp; <span class="keyword">operator</span>*() <span class="keyword">const</span>; <span class="comment">// never throws</span></span><br></pre></td></tr></table></figure>
<p>&#x8FD4;&#x56DE;&#x4FDD;&#x5B58;&#x7684;&#x6307;&#x9488;&#x6307;&#x5411;&#x5BF9;&#x8C61;&#x7684;&#x5F15;&#x7528;&#xFF0C;&#x5982;&#x679C;&#x4FDD;&#x5B58;&#x7684;&#x6307;&#x9488;&#x4E3A; 0&#xFF0C;&#x90A3;&#x4E48;&#x884C;&#x4E3A;&#x5C06;&#x662F;&#x672A;&#x5B9A;&#x4E49;&#x7684;&#x3002;</p>
<figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">T * <span class="keyword">operator</span>-&gt;() <span class="keyword">const</span>; <span class="comment">// never throws</span></span><br></pre></td></tr></table></figure>
<p>&#x8FD4;&#x56DE;&#x4FDD;&#x5B58;&#x7684;&#x6307;&#x9488;&#xFF0C;&#x5982;&#x679C;&#x4FDD;&#x5B58;&#x7684;&#x6307;&#x9488;&#x4E3A; 0&#xFF0C;&#x90A3;&#x4E48;&#x884C;&#x4E3A;&#x5C06;&#x662F;&#x672A;&#x5B9A;&#x4E49;&#x7684;&#x3002;</p>
<h3 id="get"><a href="#get" class="headerlink" title="get"></a>get</h3><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="function">T * <span class="title">get</span><span class="params">()</span> <span class="keyword">const</span></span>; <span class="comment">// never throws</span></span><br></pre></td></tr></table></figure>
<p>&#x8FD4;&#x56DE;&#x4FDD;&#x5B58;&#x7684;&#x6307;&#x9488;&#xFF0C;<strong>T &#x5FC5;&#x987B;&#x4E3A;&#x5B8C;&#x6574;&#x7C7B;&#x578B;</strong>&#x3002;&#x770B;&#x667A;&#x80FD;&#x6307;&#x9488;&#x7684; <a href="http://www.boost.org/doc/libs/1_61_0/libs/smart_ptr/smart_ptr.htm#common_requirements" target="_blank" rel="external"><strong>&#x901A;&#x5E38;&#x8981;&#x6C42;</strong></a>&#x3002;</p>
<h3 id="conversions"><a href="#conversions" class="headerlink" title="conversions"></a>conversions</h3><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">operator</span> unspecified-<span class="keyword">bool</span>-type () <span class="keyword">const</span>; <span class="comment">// never throws</span></span><br></pre></td></tr></table></figure>
<p>&#x8FD4;&#x56DE;&#x672A;&#x6307;&#x5B9A;&#x7684;&#x503C;&#xFF0C;&#x5F53;&#x7528;&#x4E8E; boolean &#x4E0A;&#x4E0B;&#x6587;&#x65F6;&#xFF0C;&#x7B49;&#x540C;&#x4E8E; get() != 0&#x3002;</p>
<h3 id="swap"><a href="#swap" class="headerlink" title="swap"></a>swap</h3><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">swap</span><span class="params">(scoped_ptr &amp; b)</span></span>; <span class="comment">// never throws</span></span><br></pre></td></tr></table></figure>
<p>&#x4EA4;&#x6362;&#x4E24;&#x4E2A;&#x667A;&#x80FD;&#x6307;&#x9488;&#x7684;&#x5185;&#x5BB9;&#xFF0C;T &#x4E0D;&#x9700;&#x8981;&#x4E3A;&#x5B8C;&#x6574;&#x7C7B;&#x578B;&#x3002;&#x770B;&#x667A;&#x80FD;&#x6307;&#x9488;&#x7684; <a href="http://www.boost.org/doc/libs/1_61_0/libs/smart_ptr/smart_ptr.htm#common_requirements" target="_blank" rel="external"><strong>&#x901A;&#x5E38;&#x8981;&#x6C42;</strong></a>&#x3002;</p>
<h2 id="Free-Functions"><a href="#Free-Functions" class="headerlink" title="Free Functions"></a>Free Functions</h2><figure class="highlight ruby"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">template&lt;<span class="class"><span class="keyword">class</span> <span class="title">T</span>&gt; <span class="title">void</span> <span class="title">swap</span>(<span class="title">scoped_ptr</span>&lt;T&gt; &amp; <span class="title">a</span>, <span class="title">scoped_ptr</span>&lt;T&gt; &amp; <span class="title">b</span>);</span> /<span class="regexp">/ never throws</span></span><br></pre></td></tr></table></figure>
<p>&#x7B49;&#x540C;&#x4E8E; a.swap(b)&#x3002;&#x7B26;&#x5408; std::swap &#x63A5;&#x53E3;&#xFF0C;&#x63D0;&#x4F9B;&#x4E86;&#x6CDB;&#x578B;&#x7F16;&#x7A0B;&#x7684;&#x652F;&#x6301;&#x3002;</p>
<h2 id="Example"><a href="#Example" class="headerlink" title="Example"></a>Example</h2><p>&#x4E0B;&#x9762;&#x8FD9;&#x4E2A;&#x4F8B;&#x5B50;&#x5C55;&#x793A;&#x4E86; scoped_ptr &#x7684;&#x4F7F;&#x7528;&#xFF1A;<br><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// scoped_ptr_example1.cpp</span></span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;boost/scoped_ptr.hpp&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;iostream&gt;</span></span></span><br><span class="line"></span><br><span class="line"><span class="keyword">struct</span> Shoe { ~Shoe() { <span class="built_in">std</span>::<span class="built_in">cout</span> &lt;&lt; <span class="string">&quot;Buckle my shoe\n&quot;</span>; } };</span><br><span class="line"></span><br><span class="line"><span class="keyword">class</span> MyClass {</span><br><span class="line"> boost::scoped_ptr&lt;<span class="keyword">int</span>&gt; ptr;</span><br><span class="line"> <span class="keyword">public</span>:</span><br><span class="line"> MyClass() : ptr(<span class="keyword">new</span> <span class="keyword">int</span>) { *ptr = <span class="number">0</span>; }</span><br><span class="line"> <span class="function"><span class="keyword">int</span> <span class="title">add_one</span><span class="params">()</span> </span>{ <span class="keyword">return</span> ++*ptr; }</span><br><span class="line">};</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span></span><br><span class="line"></span>{</span><br><span class="line"> boost::scoped_ptr&lt;Shoe&gt; x(<span class="keyword">new</span> Shoe);</span><br><span class="line"> MyClass my_instance;</span><br><span class="line"> <span class="built_in">std</span>::<span class="built_in">cout</span> &lt;&lt; my_instance.add_one() &lt;&lt; <span class="string">&apos;\n&apos;</span>;</span><br><span class="line"> <span class="built_in">std</span>::<span class="built_in">cout</span> &lt;&lt; my_instance.add_one() &lt;&lt; <span class="string">&apos;\n&apos;</span>;</span><br><span class="line">}</span><br></pre></td></tr></table></figure></p>
<p>&#x7F16;&#x8BD1;&#x8FD0;&#x884C;<br><figure class="highlight stylus"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">g++ -g scoped_ptr_example1<span class="selector-class">.cpp</span> -o scoped_ptr_example1</span><br><span class="line">./scoped_ptr_example1</span><br><span class="line"></span><br><span class="line"><span class="number">1</span></span><br><span class="line"><span class="number">2</span></span><br><span class="line">Buckle my shoe</span><br></pre></td></tr></table></figure></p>
<h2 id="Rationale"><a href="#Rationale" class="headerlink" title="Rationale"></a>Rationale</h2><p>&#x4F7F;&#x7528; scoped_ptr &#x7684;&#x4E3B;&#x8981;&#x539F;&#x56E0;&#x662F;&#x5B83; &#x6BD4; auto_ptr &#x66F4;&#x52A0;&#x76F4;&#x89C2;&#xFF0C;&#x66F4;&#x52A0;&#x4FBF;&#x4E8E;&#x7EF4;&#x62A4;&#x3002;</p>
<h2 id="Handle-Body-Idiom"><a href="#Handle-Body-Idiom" class="headerlink" title="Handle/Body Idiom"></a>Handle/Body Idiom</h2><p>scoped_ptr &#x7684;&#x4E00;&#x4E2A;&#x901A;&#x5E38;&#x7528;&#x6CD5;&#x662F;&#x5B9E;&#x73B0; handle/body (&#x4E5F;&#x79F0;&#x4E3A; pimpl) idiom&#xFF0C;&#x5B83;&#x80FD;&#x907F;&#x514D;&#x518D;&#x5934;&#x6587;&#x4EF6;&#x4E2D;&#x66B4;&#x9732;&#x5177;&#x4F53;&#x5B9E;&#x73B0;&#x3002;<br><a href="http://www.boost.org/doc/libs/1_61_0/libs/smart_ptr/example/scoped_ptr_example_test.cpp" target="_blank" rel="external">scoped_ptr_example_test.cpp</a> &#x4F8B;&#x5B50;&#x5305;&#x542B;&#x4E86;&#x4E00;&#x4E2A;&#x4F7F;&#x7528; scoped_ptr&lt;&gt; &#x6765;&#x9690;&#x85CF;&#x5B9E;&#x73B0;&#x7684;&#x5934;&#x6587;&#x4EF6; <a href="http://www.boost.org/doc/libs/1_61_0/libs/smart_ptr/example/scoped_ptr_example.hpp" target="_blank" rel="external">scoped_ptr_example.hpp</a> &#x548C; &#x5305;&#x542B;&#x4E86;&#x9700;&#x8981;&#x5B8C;&#x6574;&#x7C7B;&#x578B;&#x7684;&#x6210;&#x5458;&#x51FD;&#x6570;&#x5B9E;&#x4F8B;&#x5316; <a href="http://www.boost.org/doc/libs/1_61_0/libs/smart_ptr/example/scoped_ptr_example.cpp" target="_blank" rel="external">scoped_ptr_example.cpp</a>&#x3002;</p>
<figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// scoped_ptr_example.hpp</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// Boost scoped_ptr_example header file ------------------------------------//</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// Copyright Beman Dawes 2001. Distributed under the Boost</span></span><br><span class="line"><span class="comment">// Software License, Version 1.0. (See accompanying file</span></span><br><span class="line"><span class="comment">// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">// See http://www.boost.org/libs/smart_ptr for documentation.</span></span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;boost/utility.hpp&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;boost/scoped_ptr.hpp&gt;</span></span></span><br><span class="line"></span><br><span class="line"><span class="comment">// The point of this example is to prove that even though</span></span><br><span class="line"><span class="comment">// example::implementation is an incomplete type in translation units using</span></span><br><span class="line"><span class="comment">// this header, scoped_ptr&lt; implementation &gt; is still valid because the type</span></span><br><span class="line"><span class="comment">// is complete where it counts - in the inplementation translation unit where</span></span><br><span class="line"><span class="comment">// destruction is actually instantiated.</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">class</span> example : <span class="keyword">private</span> boost::noncopyable</span><br><span class="line">{</span><br><span class="line"> <span class="keyword">public</span>:</span><br><span class="line"> example();</span><br><span class="line"> ~example();</span><br><span class="line"> <span class="function"><span class="keyword">void</span> <span class="title">do_something</span><span class="params">()</span></span>;</span><br><span class="line"> <span class="keyword">private</span>:</span><br><span class="line"> <span class="keyword">class</span> implementation;</span><br><span class="line"> boost::scoped_ptr&lt; implementation &gt; _imp; <span class="comment">// hide implementation details</span></span><br><span class="line">};</span><br></pre></td></tr></table></figure>
<figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// scoped_ptr_example.cpp</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// Boost scoped_ptr_example implementation file -----------------------------//</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// Copyright Beman Dawes 2001. Distributed under the Boost</span></span><br><span class="line"><span class="comment">// Software License, Version 1.0. (See accompanying file</span></span><br><span class="line"><span class="comment">// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">// See http://www.boost.org/libs/smart_ptr for documentation.</span></span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="string">&quot;scoped_ptr_example.hpp&quot;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;iostream&gt;</span></span></span><br><span class="line"></span><br><span class="line"><span class="keyword">class</span> example::implementation</span><br><span class="line">{</span><br><span class="line"> <span class="keyword">public</span>:</span><br><span class="line"> ~implementation() { <span class="built_in">std</span>::<span class="built_in">cout</span> &lt;&lt; <span class="string">&quot;destroying implementation\n&quot;</span>; }</span><br><span class="line">};</span><br><span class="line"></span><br><span class="line">example::example() : _imp( <span class="keyword">new</span> implementation ) {}</span><br><span class="line"></span><br><span class="line"><span class="keyword">void</span> example::do_something() { <span class="built_in">std</span>::<span class="built_in">cout</span> &lt;&lt; <span class="string">&quot;did something\n&quot;</span>; }</span><br><span class="line"></span><br><span class="line">example::~example() {}</span><br></pre></td></tr></table></figure>
<figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// Boost scoped_ptr_example_test main program -------------------------------//</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// Copyright Beman Dawes 2001. Distributed under the Boost</span></span><br><span class="line"><span class="comment">// Software License, Version 1.0. (See accompanying file</span></span><br><span class="line"><span class="comment">// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">// See http://www.boost.org/libs/smart_ptr for documentation.</span></span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="string">&quot;scoped_ptr_example.hpp&quot;</span></span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span></span><br><span class="line"></span>{</span><br><span class="line"> example my_example;</span><br><span class="line"> my_example.do_something();</span><br><span class="line"> <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
<p>&#x7F16;&#x8BD1;&#x8FD0;&#x884C;<br><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">g++ -g scoped_ptr_example.cpp scoped_ptr_example_test.cpp -o scoped_ptr_example_test</span><br><span class="line">./scoped_ptr_example_test</span><br><span class="line"></span><br><span class="line">did something</span><br><span class="line">destroying implementation</span><br></pre></td></tr></table></figure></p>
</content>
<summary type="html">
<blockquote>
<p>&#x6700;&#x8FD1;&#x5728;&#x770B;&#x9648;&#x7855;&#x7684;&#x300A;Linux&#x591A;&#x7EBF;&#x7A0B;&#x670D;&#x52A1;&#x7AEF;&#x7F16;&#x7A0B;&#xFF1A;&#x4F7F;&#x7528;muduo C++&#x7F51;&#x7EDC;&#x5E93;&#x300B;&#xFF0C;&#x7B2C;&#x4E00;&#x7AE0;&#x4E2D;&#x91CD;&#x70B9;&#x8BB2;&#x4E86;&#x591A;&#x7EBF;&#x7A0B;&#x4E0B;&#x6307;&#x9488;&#x7684;&#x5904;&#x7406;&#x95EE;&#x9898;&#xFF0C;&#x5176;&#x4E2D;&#x91CD;&#x70B9;&#x662F; shared_ptr &#x4E0E; weak_ptr, &#x5176;&#x4E2D;&#x8FD8;&#x63D0;&#x5230;&#x5728;&#x5185;&#x5B58;&#x6CC4;&#x9732;&#x548C;&#x91CD;&#x590D;&#x91CA;&#x653E;&#x4E2D;&#x4F7F;&#x7528; scoped_ptr&#x3002; &#x4E0A;&#x4E09;&#x7BC7;&#x5B66;&#x4E60;&#x4E86; shared_ptr &#x7684;&#x57FA;&#x672C;&#x7528;&#x6CD5; ( <a href="/2016/06/09/shared-ptr&#x7C7B;&#x6A21;&#x7248;/">shared_ptr&#x7C7B;&#x6A21;&#x7248;</a> ,<a href="/2016/06/12/shared-ptr&#x7C7B;&#x6A21;&#x7248;-2/">shared_ptr&#x7C7B;&#x6A21;&#x677F;(2)</a>) &#x548C; weak_ptr &#x7684;&#x57FA;&#x672C;&#x7528;&#x6CD5; ( <a href="/2016/06/11/weak-ptr&#x7C7B;&#x6A21;&#x7248;/">waek_ptr&#x7C7B;&#x6A21;&#x7248;</a> ) &#xFF0C;&#x4ECA;&#x5929;&#x7EE7;&#x7EED;&#x5B66;&#x4E60; scoped_ptr &#xFF0C;&#x4EE5;&#x4E0B;&#x662F;&#x5BF9; <a href="http://www.boost.org/doc/libs/1_61_0/libs/smart_ptr/scoped_ptr.htm">scoped_ptr class template</a> &#x7684;&#x90E8;&#x5206;&#x4E2D;&#x6587;&#x7FFB;&#x8BD1;&#x3002;</p>
</blockquote>
</summary>
<category term="Unix/Linux" scheme="http://deyituo.github.io/categories/Unix-Linux/"/>
<category term="shared_ptr" scheme="http://deyituo.github.io/tags/shared-ptr/"/>
<category term="C++" scheme="http://deyituo.github.io/tags/C/"/>
<category term="boost" scheme="http://deyituo.github.io/tags/boost/"/>
</entry>
<entry>
<title>shared_ptr类模版(2)</title>
<link href="http://deyituo.github.io/2016/06/12/shared-ptr%E7%B1%BB%E6%A8%A1%E7%89%88-2/"/>
<id>http://deyituo.github.io/2016/06/12/shared-ptr类模版-2/</id>
<published>2016-06-12T02:09:09.000Z</published>
<updated>2016-06-14T02:08:22.000Z</updated>
<content type="html"><blockquote>
<p>&#x6700;&#x8FD1;&#x5728;&#x770B;&#x9648;&#x7855;&#x7684;&#x300A;Linux&#x591A;&#x7EBF;&#x7A0B;&#x670D;&#x52A1;&#x7AEF;&#x7F16;&#x7A0B;&#xFF1A;&#x4F7F;&#x7528;muduo C++&#x7F51;&#x7EDC;&#x5E93;&#x300B;&#xFF0C;&#x7B2C;&#x4E00;&#x7AE0;&#x4E2D;&#x91CD;&#x70B9;&#x8BB2;&#x4E86;&#x591A;&#x7EBF;&#x7A0B;&#x4E0B;&#x6307;&#x9488;&#x7684;&#x5904;&#x7406;&#x95EE;&#x9898;&#xFF0C;&#x5176;&#x4E2D;&#x91CD;&#x70B9;&#x662F; shared_ptr &#x4E0E; weak_ptr, &#x4E0A;&#x4E24;&#x7BC7;&#x5B66;&#x4E60;&#x4E86; shared_ptr &#x7684;&#x57FA;&#x672C;&#x7528;&#x6CD5; ( <a href="/2016/06/09/shared-ptr&#x7C7B;&#x6A21;&#x7248;/">shared_ptr&#x7C7B;&#x6A21;&#x7248;</a> ) &#x548C; weak_ptr &#x7684;&#x57FA;&#x672C;&#x7528;&#x6CD5; ( <a href="/2016/06/11/weak-ptr&#x7C7B;&#x6A21;&#x7248;/">waek_ptr&#x7C7B;&#x6A21;&#x7248;</a> ) &#xFF0C;&#x4ECA;&#x5929;&#x7EE7;&#x7EED;&#x5B66;&#x4E60; shared_ptr &#xFF0C;&#x4EE5;&#x4E0B;&#x662F;&#x5BF9; <a href="http://www.boost.org/doc/libs/1_61_0/libs/smart_ptr/sp_techniques.html" target="_blank" rel="external">Smart Pointer Programming Techniques</a> &#x7684;&#x90E8;&#x5206;&#x4E2D;&#x6587;&#x7FFB;&#x8BD1;&#x3002;</p>
</blockquote>
<a id="more"></a>
<h2 id="Using-incomplete-classes-for-implementation-hiding"><a href="#Using-incomplete-classes-for-implementation-hiding" class="headerlink" title="Using incomplete classes for implementation hiding"></a>Using incomplete classes for implementation hiding</h2><p>&#x5206;&#x79BB;&#x63A5;&#x53E3;&#x4E0E;&#x5B9E;&#x73B0;&#x7684;&#x4E00;&#x4E2A;&#x6709;&#x6548;&#x65B9;&#x5F0F;&#x662F;&#x4F7F;&#x7528;&#x4E0D;&#x5B8C;&#x6574;&#x7C7B;&#x578B;&#x7C7B;&#x7684;&#x6307;&#x9488;&#x3002;<br><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">class</span> FILE;</span><br><span class="line"></span><br><span class="line"><span class="function">FILE * <span class="title">fopen</span><span class="params">(<span class="keyword">char</span> <span class="keyword">const</span> * name, <span class="keyword">char</span> <span class="keyword">const</span> * mode)</span></span>;</span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">fread</span><span class="params">(FILE * f, <span class="keyword">void</span> * data, <span class="keyword">size_t</span> size)</span></span>;</span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">fclose</span><span class="params">(FILE * f)</span></span>;</span><br></pre></td></tr></table></figure></p>
<p>&#x53EF;&#x4EE5;&#x4F7F;&#x7528; shared_ptr &#x6765;&#x8868;&#x8FBE;&#x4E0A;&#x9762;&#x7684;&#x63A5;&#x53E3;&#xFF0C;&#x4F7F;&#x5F97;&#x4E0D;&#x9700;&#x8981;&#x624B;&#x52A8;&#x8C03;&#x7528; fclose&#x3002;</p>
<figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">class</span> FILE;</span><br><span class="line"></span><br><span class="line"><span class="built_in">shared_ptr</span>&lt;FILE&gt; fopen(<span class="keyword">char</span> <span class="keyword">const</span> * name, <span class="keyword">char</span> <span class="keyword">const</span> * mode);</span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">fread</span><span class="params">(<span class="built_in">shared_ptr</span>&lt;FILE&gt; f, <span class="keyword">void</span> * data, <span class="keyword">size_t</span> size)</span></span>;</span><br></pre></td></tr></table></figure>
<p>&#x8FD9;&#x79CD;&#x65B9;&#x5F0F;&#x662F;&#x5229;&#x7528;&#x4E86; shared_ptr &#x80FD;&#x591F;&#x81EA;&#x52A8;&#x8C03;&#x7528; deleter &#x7684;&#x673A;&#x5236;&#x6765;&#x53BB;&#x9664;&#x4E86; fclose &#x7684;&#x663E;&#x793A;&#x8C03;&#x7528;&#xFF0C;&#x5B9E;&#x9645;&#x4E0A;&#xFF0C;&#x5F53; X &#x662F;&#x4E0D;&#x5B8C;&#x6574;&#x7C7B;&#x578B;&#x65F6;&#xFF0C;shared_ptr&lt; X &gt; &#x80FD;&#x591F;&#x88AB;&#x62F7;&#x8D1D;&#x548C;&#x9500;&#x6BC1;&#x3002;</p>
<h2 id="The-&#x201C;Pimpl&#x201D;-idiom"><a href="#The-&#x201C;Pimpl&#x201D;-idiom" class="headerlink" title="The &#x201C;Pimpl&#x201D; idiom"></a>The &#x201C;Pimpl&#x201D; idiom</h2><p>&#x4E0D;&#x5B8C;&#x6574;&#x7C7B;&#x7684;&#x4E00;&#x4E2A; C++ &#x53D8;&#x79CD;&#x662F; &#x201C;Pimpl&#x201D; idiom&#xFF0C;&#x4E0D;&#x5B8C;&#x6574;&#x7C7B;&#x6CA1;&#x6709;&#x66B4;&#x9732;&#x4E8E;&#x7528;&#x6237;&#xFF0C;shared_ptr &#x80FD;&#x591F;&#x7528;&#x6765;&#x5B9E;&#x73B0;&#x4E00;&#x4E2A; &#x201C;Pimpl&#x201D;&#xFF1A;<br><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// file.hpp:</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">class</span> file</span><br><span class="line">{</span><br><span class="line"><span class="keyword">private</span>:</span><br><span class="line"></span><br><span class="line"> <span class="keyword">class</span> impl;</span><br><span class="line"> <span class="built_in">shared_ptr</span>&lt;impl&gt; pimpl_;</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span>:</span><br><span class="line"></span><br><span class="line"> file(<span class="keyword">char</span> <span class="keyword">const</span> * name, <span class="keyword">char</span> <span class="keyword">const</span> * mode);</span><br><span class="line"></span><br><span class="line"> <span class="comment">// compiler generated members are fine and useful</span></span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">void</span> <span class="title">read</span><span class="params">(<span class="keyword">void</span> * data, <span class="keyword">size_t</span> size)</span></span>;</span><br><span class="line">};</span><br></pre></td></tr></table></figure></p>
<figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// file.cpp:</span></span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="string">&quot;file.hpp&quot;</span></span></span><br><span class="line"></span><br><span class="line"><span class="keyword">class</span> file::impl</span><br><span class="line">{</span><br><span class="line"><span class="keyword">private</span>:</span><br><span class="line"></span><br><span class="line"> impl(impl <span class="keyword">const</span> &amp;);</span><br><span class="line"> impl &amp; <span class="keyword">operator</span>=(impl <span class="keyword">const</span> &amp;);</span><br><span class="line"></span><br><span class="line"> <span class="comment">// private data</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span>:</span><br><span class="line"></span><br><span class="line"> impl(<span class="keyword">char</span> <span class="keyword">const</span> * name, <span class="keyword">char</span> <span class="keyword">const</span> * mode) { ... }</span><br><span class="line"> ~impl() { ... }</span><br><span class="line"> <span class="function"><span class="keyword">void</span> <span class="title">read</span><span class="params">(<span class="keyword">void</span> * data, <span class="keyword">size_t</span> size)</span> </span>{ ... }</span><br><span class="line">};</span><br><span class="line"></span><br><span class="line">file::file(<span class="keyword">char</span> <span class="keyword">const</span> * name, <span class="keyword">char</span> <span class="keyword">const</span> * mode): pimpl_(<span class="keyword">new</span> impl(name, mode))</span><br><span class="line">{</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="keyword">void</span> file::read(<span class="keyword">void</span> * data, <span class="keyword">size_t</span> size)</span><br><span class="line">{</span><br><span class="line"> pimpl_-&gt;read(data, size);</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
<p>&#x8FD9;&#x91CC;&#x7684;&#x5173;&#x952E;&#x70B9;&#x662F;&#x7F16;&#x8BD1;&#x5668;&#x4EA7;&#x751F;&#x7684;&#x590D;&#x5236;&#x62F7;&#x8D1D;&#x51FD;&#x6570;&#xFF0C;&#x8D4B;&#x503C;&#x51FD;&#x6570;&#xFF0C;&#x6790;&#x6784;&#x51FD;&#x6570;&#x90FD;&#x6709;&#x5176;&#x610F;&#x4E49;&#xFF08;&#x4EE3;&#x7801;&#x4E2D;file&#x6CA1;&#x6709;&#x5B9A;&#x4E49;&#xFF09;&#xFF0C;&#x56E0;&#x6B64;&#xFF0C;file &#x662F;&#x53EF;&#x4EE5;&#x62F7;&#x8D1D;&#x590D;&#x5236;&#x548C;&#x8D4B;&#x503C;&#x7684;&#xFF0C;&#x4F7F;&#x5F97;&#x5B83;&#x80FD;&#x591F;&#x7528;&#x5728;&#x6807;&#x51C6;&#x5BB9;&#x5668;&#x91CC;&#x3002;</p>
<h2 id="Using-abstract-classes-for-implementation-hiding"><a href="#Using-abstract-classes-for-implementation-hiding" class="headerlink" title="Using abstract classes for implementation hiding"></a>Using abstract classes for implementation hiding</h2><p>&#x53E6;&#x5916;&#x4E00;&#x4E2A;&#x5728; C++ &#x4E2D;&#x5206;&#x79BB;&#x63A5;&#x53E3;&#x4E0E;&#x5B9E;&#x73B0;&#x7684;&#x65B9;&#x5F0F;&#x662F;&#x4F7F;&#x7528; <strong>&#x865A;&#x57FA;&#x7C7B;</strong> &#x548C; <strong>&#x5DE5;&#x5382;&#x51FD;&#x6570;</strong>&#xFF0C;&#x865A;&#x7C7B;&#x6709;&#x65F6;&#x5019;&#x88AB;&#x79F0;&#x4E3A;&#x63A5;&#x53E3;&#xFF0C;&#x8FD9;&#x79CD;&#x6A21;&#x5F0F;&#x88AB;&#x79F0;&#x4E3A;&#x57FA;&#x4E8E;&#x63A5;&#x53E3;&#x7F16;&#x7A0B; (&#x201C;interface-based programming&#x201D; )&#xFF0C;&#x8FD9;&#x65F6;&#xFF0C;shared_ptr &#x53EF;&#x4EE5;&#x4F5C;&#x4E3A;&#x5DE5;&#x5382;&#x51FD;&#x6570;&#x7684;&#x8FD4;&#x56DE;&#x7C7B;&#x578B;&#x3002;<br><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// X.hpp:</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">class</span> X</span><br><span class="line">{</span><br><span class="line"><span class="keyword">public</span>:</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">virtual</span> <span class="keyword">void</span> <span class="title">f</span><span class="params">()</span> </span>= <span class="number">0</span>;</span><br><span class="line"> <span class="function"><span class="keyword">virtual</span> <span class="keyword">void</span> <span class="title">g</span><span class="params">()</span> </span>= <span class="number">0</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">protected</span>:</span><br><span class="line"></span><br><span class="line"> ~X() {}</span><br><span class="line">};</span><br><span class="line"></span><br><span class="line"><span class="built_in">shared_ptr</span>&lt;X&gt; createX();</span><br></pre></td></tr></table></figure></p>
<p>&#x7559;&#x610F; X_impl &#x653E;&#x5728;&#x4E86; cpp &#x4E2D;&#x58F0;&#x660E;&#x548C;&#x5B9A;&#x4E49;&#x3002;</p>
<figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//X.cpp:</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">class</span> X_impl: <span class="keyword">public</span> X</span><br><span class="line">{</span><br><span class="line"><span class="keyword">private</span>:</span><br><span class="line"></span><br><span class="line"> X_impl(X_impl <span class="keyword">const</span> &amp;);</span><br><span class="line"> X_impl &amp; <span class="keyword">operator</span>=(X_impl <span class="keyword">const</span> &amp;);</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span>:</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">virtual</span> <span class="keyword">void</span> <span class="title">f</span><span class="params">()</span></span><br><span class="line"> </span>{</span><br><span class="line"> <span class="comment">// ...</span></span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">virtual</span> <span class="keyword">void</span> <span class="title">g</span><span class="params">()</span></span><br><span class="line"> </span>{</span><br><span class="line"> <span class="comment">// ...</span></span><br><span class="line"> }</span><br><span class="line">};</span><br><span class="line"></span><br><span class="line"><span class="built_in">shared_ptr</span>&lt;X&gt; createX()</span><br><span class="line">{</span><br><span class="line"> <span class="built_in">shared_ptr</span>&lt;X&gt; px(<span class="keyword">new</span> X_impl);</span><br><span class="line"> <span class="keyword">return</span> px;</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
<p>shared_ptr &#x7684;&#x4E00;&#x4E2A;&#x5173;&#x952E;&#x5C5E;&#x6027;&#x662F;&#x5206;&#x914D;&#x5185;&#x5B58;&#xFF0C;&#x6784;&#x9020;&#x51FD;&#x6570;&#xFF0C;&#x91CA;&#x653E;&#x5185;&#x5B58;&#xFF0C;&#x6790;&#x6784;&#x51FD;&#x6570;&#x7684;&#x7EC6;&#x8282;&#x662F;&#x5728;&#x5DE5;&#x5382;&#x51FD;&#x6570;&#x7684;&#x6784;&#x9020;&#x51FD;&#x6570;&#x91CC;&#x9762;&#x5F00;&#x59CB;&#x7684;&#x3002;&#x7559;&#x610F;&#x4F8B;&#x5B50;&#x4E2D;&#x7684;&#x88AB;&#x4FDD;&#x62A4;&#x7684;&#x975E;&#x865A;&#x6790;&#x6784;&#x51FD;&#x6570;&#xFF08;&#x865A;&#x6790;&#x6784;&#x51FD;&#x6570;&#x53EF;&#x4EE5;&#x786E;&#x4FDD;&#x7A0B;&#x5E8F;&#x6B63;&#x786E;&#x8C03;&#x7528;&#x6307;&#x9488;&#x5BF9;&#x8C61;&#x7684;&#x6790;&#x6784;&#x51FD;&#x6570;&#xFF0C;&#x5982;&#x679C;&#x6CA1;&#x6709; virtual &#x5173;&#x952E;&#x5B57;&#xFF0C;&#x5219;&#x7531;&#x6307;&#x9488;&#x7684;&#x7C7B;&#x578B;&#x51B3;&#x5B9A;&#x6790;&#x6784;&#x51FD;&#x6570;&#xFF09;&#xFF0C;&#x5BA2;&#x6237;&#x4EE3;&#x7801;&#x4E0D;&#x80FD;&#x591F;&#xFF08;&#x4E5F;&#x4E0D;&#x9700;&#x8981;&#xFF09;&#x5220;&#x9664;&#x6307;&#x5411; X &#x7684;&#x6307;&#x9488;&#xFF1B;createX &#x8FD4;&#x56DE;&#x7684; shared_ptr&lt; X &gt; &#x80FD;&#x591F;&#x6B63;&#x786E;&#x5730;&#x8C03;&#x7528; &#xFF5E;X_impl&#x3002;</p>
<h2 id="Preventing-delete-px-get"><a href="#Preventing-delete-px-get" class="headerlink" title="Preventing delete px.get()"></a>Preventing delete px.get()</h2><p>&#x963B;&#x6B62;&#x5BA2;&#x6237;&#x4EE3;&#x7801;&#x8BD5;&#x56FE;&#x5220;&#x9664;&#x4E00;&#x4E2A;&#x88AB; shared_ptr &#x7BA1;&#x7406;&#x7684;&#x6307;&#x9488;&#x662F;&#x7ECF;&#x5E38;&#x9700;&#x8981;&#x7684;&#xFF0C;&#x524D;&#x9762;&#x7684;&#x6280;&#x672F;&#x4E2D;&#x5C55;&#x793A;&#x4E86;&#x5176;&#x4E2D;&#x4E00;&#x4E2A;&#x529E;&#x6CD5;&#xFF0C;&#x4F7F;&#x7528; protected &#x7684;&#x6790;&#x6784;&#x51FD;&#x6570;&#xFF0C;&#x53E6;&#x5916;&#x4E00;&#x4E2A;&#x65B9;&#x6CD5;&#x662F;&#x4F7F;&#x7528;&#x79C1;&#x6709;&#x7684; deleter&#xFF1A;<br><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">class</span> X</span><br><span class="line">{</span><br><span class="line"><span class="keyword">private</span>:</span><br><span class="line"></span><br><span class="line"> ~X();</span><br><span class="line"></span><br><span class="line"> <span class="keyword">class</span> deleter;</span><br><span class="line"> <span class="keyword">friend</span> <span class="keyword">class</span> deleter;</span><br><span class="line"></span><br><span class="line"> <span class="keyword">class</span> deleter</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">public</span>:</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">void</span> <span class="title">operator</span><span class="params">()</span><span class="params">(X * p)</span> </span>{ <span class="keyword">delete</span> p; }</span><br><span class="line"> };</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span>:</span><br><span class="line"></span><br><span class="line"> <span class="keyword">static</span> <span class="built_in">shared_ptr</span>&lt;X&gt; create()</span><br><span class="line"> {</span><br><span class="line"> <span class="built_in">shared_ptr</span>&lt;X&gt; px(<span class="keyword">new</span> X, X::deleter());</span><br><span class="line"> <span class="keyword">return</span> px;</span><br><span class="line"> }</span><br><span class="line">};</span><br></pre></td></tr></table></figure></p>
<h2 id="Using-a-shared-ptr-to-hold-a-pointer-to-an-array"><a href="#Using-a-shared-ptr-to-hold-a-pointer-to-an-array" class="headerlink" title="Using a shared_ptr to hold a pointer to an array"></a>Using a shared_ptr to hold a pointer to an array</h2><p>shared_ptr &#x80FD;&#x591F;&#x7528;&#x6765;&#x4FDD;&#x5B58; new[] &#x64CD;&#x4F5C;&#x51FA;&#x6765;&#x7684;&#x6570;&#x7EC4;&#x7684;&#x6307;&#x9488;&#xFF1A;<br><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">shared_ptr</span>&lt;X&gt; px(<span class="keyword">new</span> X[<span class="number">1</span>], checked_array_deleter&lt;X&gt;());</span><br></pre></td></tr></table></figure></p>
<p>&#x6CE8;&#x610F;&#xFF0C;&#x5982;&#x679C;&#x6709;&#x5F97;&#x9009;&#x62E9;&#xFF0C;<a href="http://www.boost.org/doc/libs/1_61_0/libs/smart_ptr/shared_array.htm" target="_blank" rel="external">shared_array</a> &#x66F4;&#x7ECF;&#x5E38;&#x9002;&#x5408;&#x8FD9;&#x4E2A;&#x4EFB;&#x52A1;&#xFF0C;&#x5B83;&#x6709;&#x4E00;&#x4E2A;&#x4E13;&#x95E8;&#x4E3A;&#x6570;&#x7EC4;&#x8BBE;&#x8BA1;&#x7684;&#x63A5;&#x53E3;&#xFF0C;&#x4E0D;&#x9700;&#x8981; operator* &#x4E0E; operator-&gt;&#xFF0C;&#x5E76;&#x4E14;&#x4E0D;&#x9700;&#x8981;&#x6307;&#x9488;&#x7684;&#x8F6C;&#x5316;&#x3002;(?)</p>
<h2 id="Encapsulating-allocation-details-wrapping-factory-functions"><a href="#Encapsulating-allocation-details-wrapping-factory-functions" class="headerlink" title="Encapsulating allocation details, wrapping factory functions"></a>Encapsulating allocation details, wrapping factory functions</h2><p>shared_ptr &#x80FD;&#x591F;&#x7528;&#x6765;&#x521B;&#x5EFA; C++ &#x7684; wrappers &#x6765;&#x9002;&#x5E94;&#x73B0;&#x6709; C &#x98CE;&#x683C;&#x7684;&#x5E93;&#x63A5;&#x53E3;&#xFF08;&#x5E93;&#x63A5;&#x53E3;&#x4E2D;&#x5DE5;&#x5382;&#x51FD;&#x6570;&#x8FD4;&#x56DE;&#x7684;&#x6307;&#x9488;&#xFF09;&#xFF0C;&#x4ECE;&#x800C;&#x5C01;&#x88C5;&#x5185;&#x5B58;&#x5206;&#x914D;&#x7684;&#x7EC6;&#x8282;&#x3002;&#x8003;&#x8651;&#x4E0B;&#x9762;&#x8FD9;&#x4E2A;&#x63A5;&#x53E3;&#xFF0C;CreateX &#x53EF;&#x80FD;&#x4ECE;&#x5B83;&#x7684;&#x79C1;&#x6709;&#x5806;&#x91CC;&#x5206;&#x914D;&#x5185;&#x5B58;&#x7ED9; X&#xFF0C; &#xFF5E;X &#x53EF;&#x80FD;&#x65E0;&#x6CD5;&#x8BBF;&#x95EE;&#xFF0C;&#x6216;&#x8005; X &#x53EF;&#x80FD;&#x4E0D;&#x662F;&#x5B8C;&#x6574;&#x7684;&#xFF1A;<br><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="function">X * <span class="title">CreateX</span><span class="params">()</span></span>;</span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">DestroyX</span><span class="params">(X *)</span></span>;</span><br><span class="line">``` </span><br><span class="line">&#x9500;&#x6BC1; CreateX &#x8FD4;&#x56DE;&#x7684;&#x6307;&#x9488;&#x7684;&#x552F;&#x4E00;&#x65B9;&#x6CD5;&#x662F;&#x8C03;&#x7528; DestroyX &#x51FD;&#x6570;&#x3002;</span><br><span class="line"><span class="built_in">shared_ptr</span> &#x7684; wrapper &#x53EF;&#x80FD;&#x5982;&#x4E0B;&#xFF1A;</span><br><span class="line">```C++</span><br><span class="line"><span class="built_in">shared_ptr</span>&lt;X&gt; createX()</span><br><span class="line">{</span><br><span class="line"> <span class="built_in">shared_ptr</span>&lt;X&gt; px(CreateX(), DestroyX);</span><br><span class="line"> <span class="keyword">return</span> px;</span><br><span class="line">}</span><br></pre></td></tr></table></figure></p>
<p>&#x5BA2;&#x6237;&#x7AEF;&#x4EE3;&#x7801;&#x8C03;&#x7528; createX &#x4E0D;&#x9700;&#x8981;&#x77E5;&#x9053;&#x5BF9;&#x8C61;&#x662F;&#x5982;&#x4F55;&#x88AB;&#x5206;&#x914D;&#x5185;&#x5B58;&#x7684;&#xFF0C;&#x6790;&#x6784;&#x4E5F;&#x662F;&#x81EA;&#x52A8;&#x7684;&#x3002;</p>
<h2 id="Using-a-shared-ptr-to-hold-a-pointer-to-a-statically-allocated-object"><a href="#Using-a-shared-ptr-to-hold-a-pointer-to-a-statically-allocated-object" class="headerlink" title="Using a shared_ptr to hold a pointer to a statically allocated object"></a>Using a shared_ptr to hold a pointer to a statically allocated object</h2><p>&#x6709;&#x65F6;&#x7ED9;&#x4E00;&#x4E2A;&#x5DF2;&#x7ECF;&#x5B58;&#x5728;&#x7684;&#x5BF9;&#x8C61;&#x521B;&#x5EFA;&#x4E00;&#x4E2A; shared_ptr &#xFF0C;&#x56E0;&#x6B64;&#xFF0C;&#x5F53;&#x6CA1;&#x6709;&#x66F4;&#x591A;&#x5F15;&#x7528;&#x5269;&#x4E0B;&#x65F6;&#xFF0C;shared_ptr &#x4E0D;&#x8BD5;&#x56FE;&#x53BB;&#x9500;&#x6BC1;&#x8FD9;&#x4E2A;&#x5BF9;&#x8C61;&#xFF0C;&#x5982;&#x4E0B;&#x5DE5;&#x5382;&#x51FD;&#x6570;&#xFF1A;<br><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">shared_ptr</span>&lt;X&gt; createX();</span><br></pre></td></tr></table></figure></p>
<p>&#x6709;&#x4E9B;&#x65F6;&#x5019;&#x9700;&#x8981;&#x8FD4;&#x56DE;&#x9759;&#x6001;&#x5206;&#x914D; X &#x7684;&#x6307;&#x9488;&#xFF0C;&#x89E3;&#x51B3;&#x65B9;&#x6CD5;&#x662F;&#x4F7F;&#x7528;&#x81EA;&#x5B9A;&#x4E49;&#x7684; deleter &#x4E0D;&#x505A;&#x4EFB;&#x4F55;&#x4E1C;&#x897F;&#xFF1A;<br><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">struct</span> null_deleter</span><br><span class="line">{</span><br><span class="line"> <span class="function"><span class="keyword">void</span> <span class="title">operator</span><span class="params">()</span><span class="params">(<span class="keyword">void</span> <span class="keyword">const</span> *)</span> <span class="keyword">const</span></span><br><span class="line"> </span>{</span><br><span class="line"> }</span><br><span class="line">};</span><br><span class="line"></span><br><span class="line"><span class="keyword">static</span> X x;</span><br><span class="line"></span><br><span class="line"><span class="built_in">shared_ptr</span>&lt;X&gt; createX()</span><br><span class="line">{</span><br><span class="line"> <span class="built_in">shared_ptr</span>&lt;X&gt; px(&amp;x, null_deleter());</span><br><span class="line"> <span class="keyword">return</span> px;</span><br><span class="line">}</span><br></pre></td></tr></table></figure></p>
</content>
<summary type="html">
<blockquote>
<p>&#x6700;&#x8FD1;&#x5728;&#x770B;&#x9648;&#x7855;&#x7684;&#x300A;Linux&#x591A;&#x7EBF;&#x7A0B;&#x670D;&#x52A1;&#x7AEF;&#x7F16;&#x7A0B;&#xFF1A;&#x4F7F;&#x7528;muduo C++&#x7F51;&#x7EDC;&#x5E93;&#x300B;&#xFF0C;&#x7B2C;&#x4E00;&#x7AE0;&#x4E2D;&#x91CD;&#x70B9;&#x8BB2;&#x4E86;&#x591A;&#x7EBF;&#x7A0B;&#x4E0B;&#x6307;&#x9488;&#x7684;&#x5904;&#x7406;&#x95EE;&#x9898;&#xFF0C;&#x5176;&#x4E2D;&#x91CD;&#x70B9;&#x662F; shared_ptr &#x4E0E; weak_ptr, &#x4E0A;&#x4E24;&#x7BC7;&#x5B66;&#x4E60;&#x4E86; shared_ptr &#x7684;&#x57FA;&#x672C;&#x7528;&#x6CD5; ( <a href="/2016/06/09/shared-ptr&#x7C7B;&#x6A21;&#x7248;/">shared_ptr&#x7C7B;&#x6A21;&#x7248;</a> ) &#x548C; weak_ptr &#x7684;&#x57FA;&#x672C;&#x7528;&#x6CD5; ( <a href="/2016/06/11/weak-ptr&#x7C7B;&#x6A21;&#x7248;/">waek_ptr&#x7C7B;&#x6A21;&#x7248;</a> ) &#xFF0C;&#x4ECA;&#x5929;&#x7EE7;&#x7EED;&#x5B66;&#x4E60; shared_ptr &#xFF0C;&#x4EE5;&#x4E0B;&#x662F;&#x5BF9; <a href="http://www.boost.org/doc/libs/1_61_0/libs/smart_ptr/sp_techniques.html">Smart Pointer Programming Techniques</a> &#x7684;&#x90E8;&#x5206;&#x4E2D;&#x6587;&#x7FFB;&#x8BD1;&#x3002;</p>
</blockquote>
</summary>
<category term="Unix/Linux" scheme="http://deyituo.github.io/categories/Unix-Linux/"/>
<category term="shared_ptr" scheme="http://deyituo.github.io/tags/shared-ptr/"/>
<category term="C++" scheme="http://deyituo.github.io/tags/C/"/>
<category term="boost" scheme="http://deyituo.github.io/tags/boost/"/>
</entry>
<entry>
<title>weak_ptr类模版</title>
<link href="http://deyituo.github.io/2016/06/11/weak-ptr%E7%B1%BB%E6%A8%A1%E7%89%88/"/>
<id>http://deyituo.github.io/2016/06/11/weak-ptr类模版/</id>
<published>2016-06-11T09:33:55.000Z</published>
<updated>2016-06-12T01:18:46.000Z</updated>
<content type="html"><blockquote>
<p>&#x6700;&#x8FD1;&#x5728;&#x770B;&#x9648;&#x7855;&#x7684;&#x300A;Linux&#x591A;&#x7EBF;&#x7A0B;&#x670D;&#x52A1;&#x7AEF;&#x7F16;&#x7A0B;&#xFF1A;&#x4F7F;&#x7528;muduo C++&#x7F51;&#x7EDC;&#x5E93;&#x300B;&#xFF0C;&#x7B2C;&#x4E00;&#x7AE0;&#x4E2D;&#x91CD;&#x70B9;&#x8BB2;&#x4E86;&#x591A;&#x7EBF;&#x7A0B;&#x4E0B;&#x6307;&#x9488;&#x7684;&#x5904;&#x7406;&#x95EE;&#x9898;&#xFF0C;&#x5176;&#x4E2D;&#x91CD;&#x70B9;&#x662F; shared_ptr &#x4E0E; weak_ptr, &#x4E0A;&#x4E00;&#x7BC7;&#x535A;&#x5BA2;&#x5B66;&#x4E60;&#x4E86; shared_ptr &#x7684;&#x57FA;&#x672C;&#x7528;&#x6CD5; ( <a href="/2016/06/09/shared-ptr&#x7C7B;&#x6A21;&#x7248;/">shared_ptr&#x7C7B;&#x6A21;&#x7248;</a> )&#xFF0C;&#x4ECA;&#x5929;&#x7EE7;&#x7EED;&#x5B66;&#x4E60; weak_ptr &#xFF0C;&#x4EE5;&#x4E0B;&#x662F;&#x5BF9; <a href="http://www.boost.org/doc/libs/1_61_0/libs/smart_ptr/weak_ptr.htm" target="_blank" rel="external">boost::weak_ptr</a> &#x7684;&#x4E2D;&#x6587;&#x7FFB;&#x8BD1;&#x3002;</p>
</blockquote>
<a id="more"></a>
<h2 id="Introduction"><a href="#Introduction" class="headerlink" title="Introduction"></a>Introduction</h2><h3 id="weak-ptr-&#x8F6C;&#x5316;&#x5230;-shared-ptr"><a href="#weak-ptr-&#x8F6C;&#x5316;&#x5230;-shared-ptr" class="headerlink" title="weak_ptr &#x8F6C;&#x5316;&#x5230; shared_ptr"></a>weak_ptr &#x8F6C;&#x5316;&#x5230; shared_ptr</h3><p>weak_ptr &#x7C7B;&#x6A21;&#x7248;&#x5B58;&#x50A8;&#x4E86;&#x88AB; shared_ptr &#x7BA1;&#x7406;&#x7684;&#x5BF9;&#x8C61;&#x7684;&#x201C;&#x5F31;&#x5F15;&#x7528;&#x201D;&#xFF0C;weak_ptr &#x80FD;&#x901A;&#x8FC7;&#x4F7F;&#x7528; <a href="http://www.boost.org/doc/libs/1_61_0/libs/smart_ptr/shared_ptr.htm#constructors" target="_blank" rel="external">shared_ptr &#x7684;&#x6784;&#x9020;&#x51FD;&#x6570;</a> &#x6216;&#x8005;&#x6210;&#x5458;&#x51FD;&#x6570; &#x8F6C;&#x5316;&#x5230; shared_ptr&#x3002;&#x5F53;&#x6700;&#x540E;&#x4E00;&#x4E2A;&#x6307;&#x5411;&#x5BF9;&#x8C61;&#x7684; shared_ptr &#x88AB;&#x9500;&#x6BC1;&#xFF0C;&#x5BF9;&#x8C61;&#x4F1A;&#x88AB;&#x9500;&#x6BC1;&#x3002;weak_ptr &#x7684;&#x5BF9;&#x8C61;&#x88AB;&#x9500;&#x6BC1;&#x540E;&#xFF0C;&#x8BD5;&#x56FE;&#x4ECE; weak_ptr &#x83B7;&#x5F97; shared_ptr &#x5C06;&#x5931;&#x8D25;&#xFF0C;&#x5E76;&#x4E14;&#x6784;&#x9020;&#x51FD;&#x6570;&#x4F1A;&#x629B;&#x51FA;&#x4E00;&#x4E2A;&#x7C7B;&#x578B;&#x4E3A; boost::bad_weak_ptr &#x7684;&#x5F02;&#x5E38;&#xFF0C;weak_ptr::lock &#x5C06;&#x8FD4;&#x56DE;&#x4E00;&#x4E2A;&#x7A7A;&#x7684; shared_ptr&#x3002;&#xFF08;&#xFF1F;&#xFF09;</p>
<h3 id="&#x6807;&#x51C6;&#x5E93;"><a href="#&#x6807;&#x51C6;&#x5E93;" class="headerlink" title="&#x6807;&#x51C6;&#x5E93;"></a>&#x6807;&#x51C6;&#x5E93;</h3><p>&#x6BCF;&#x4E00;&#x4E2A; weak_ptr &#x90FD;&#x80FD;&#x62F7;&#x8D1D;&#x6784;&#x9020;&#x548C;&#x8D4B;&#x503C;&#xFF0C;&#x56E0;&#x800C;&#x80FD;&#x7528;&#x4E8E;&#x6807;&#x51C6;&#x5E93;&#x5BB9;&#x5668;&#x3002;&#x53E6;&#x5916;&#xFF0C;&#x8FD8;&#x6709;&#x5BF9;&#x6BD4;&#x64CD;&#x4F5C;&#x7B26;&#xFF0C;&#x4F7F;&#x5F97; weak_ptr &#x80FD;&#x7528;&#x4E8E;&#x6807;&#x51C6;&#x5E93;&#x7684;&#x5173;&#x8054;&#x5BB9;&#x5668;&#x3002;</p>
<h3 id="&#x64CD;&#x4F5C;"><a href="#&#x64CD;&#x4F5C;" class="headerlink" title="&#x64CD;&#x4F5C;"></a>&#x64CD;&#x4F5C;</h3><p>weak_ptr &#x64CD;&#x4F5C;&#x7B26;&#x4E0D;&#x629B;&#x51FA;&#x5F02;&#x5E38;&#x3002;</p>
<p>&#x7C7B;&#x6A21;&#x7248;&#x4F7F;&#x7528; T &#x4F5C;&#x4E3A;&#x53C2;&#x6570;&#xFF0C;T &#x4E3A;&#x6307;&#x5411;&#x7684;&#x5BF9;&#x8C61;&#x7C7B;&#x578B;&#x3002;</p>
<p>&#x4E0E; shared_ptr &#x5BF9;&#x6BD4;&#xFF0C;weak_ptr &#x63D0;&#x4F9B;&#x4E86;&#x975E;&#x5E38;&#x6709;&#x9650;&#x7684;&#x90E8;&#x5206;&#x64CD;&#x4F5C;&#xFF0C;&#x56E0;&#x4E3A;&#x5728;&#x591A;&#x7EBF;&#x7A0B;&#x7A0B;&#x5E8F;&#x91CC;&#x4F7F;&#x7528;&#x5B83;&#x5B58;&#x50A8;&#x7684;&#x6307;&#x9488;&#x5F0F;&#x901A;&#x5E38;&#x662F;&#x5371;&#x9669;&#x7684;&#xFF0C;&#x751A;&#x81F3;&#x5728;&#x5355;&#x7EBF;&#x7A0B;&#x4E2D;&#x6709;&#x65F6;&#x4E5F;&#x4E0D;&#x5B89;&#x5168;&#xFF08;&#x4E5F;&#x5C31;&#x662F;&#x8BF4;&#xFF0C;&#x5B83;&#x4F1A;&#x5F15;&#x8D77;&#x65E0;&#x5B9A;&#x4E49;&#x7684;&#x884C;&#x4E3A;&#xFF09;&#x3002;&#x5047;&#x8BBE; weak_ptr &#x62E5;&#x6709;&#x4E00;&#x4E2A; get &#x51FD;&#x6570;&#x80FD;&#x591F;&#x8FD4;&#x56DE;&#x5BF9;&#x8C61;&#x6307;&#x9488;&#xFF0C;&#x5982;&#x4E0B;&#x9762;&#x9519;&#x8BEF;&#x7684;&#x4EE3;&#x7801;&#xFF1A;<br><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">shared_ptr</span>&lt;<span class="keyword">int</span>&gt; p(<span class="keyword">new</span> <span class="keyword">int</span>(<span class="number">5</span>));</span><br><span class="line">weak_ptr&lt;<span class="keyword">int</span>&gt; q(p);</span><br><span class="line"></span><br><span class="line"><span class="comment">// some time later</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span>(<span class="keyword">int</span> * r = q.get())</span><br><span class="line">{</span><br><span class="line"> <span class="comment">// use *r</span></span><br><span class="line">}</span><br></pre></td></tr></table></figure></p>
<p>&#x60F3;&#x8C61;&#x5982;&#x679C;&#x5728; if &#x540E;&#xFF0C;&#x5728; r &#x88AB;&#x4F7F;&#x7528;&#x524D;&#xFF0C;&#x53E6;&#x5916;&#x4E00;&#x4E2A;&#x7EBF;&#x7A0B;&#x8FD0;&#x884C;&#x5230;&#x4E86;&#x8BED;&#x53E5; p.reset()&#xFF0C;&#x90A3;&#x4E48; r &#x73B0;&#x5728;&#x5C31;&#x6210;&#x4E86;&#x7A7A;&#x60AC;&#x6307;&#x9488;&#x3002;</p>
<blockquote>
<p>&#x7A7A;&#x60AC;&#x6307;&#x9488;(dangling pointer)&#x6307;&#x5411;&#x5DF2;&#x7ECF;&#x9500;&#x6BC1;&#x7684;&#x5BF9;&#x8C61;&#x6216;&#x5DF2;&#x7ECF;&#x56DE;&#x6536;&#x7684;&#x5730;&#x5740;,&#x91CE;&#x6307;&#x9488;(wild pointer)&#x6307;&#x7684;&#x662F; &#x672A;&#x7ECF;&#x521D;&#x59CB;&#x5316;&#x7684;&#x6307;&#x9488;(<a href="http://en.wikipedia.org/wiki/Dangling_pointer)&#x3002;" target="_blank" rel="external">http://en.wikipedia.org/wiki/Dangling_pointer)&#x3002;</a></p>
</blockquote>
<p>&#x8FD9;&#x4E2A;&#x95EE;&#x9898;&#x7684;&#x89E3;&#x51B3;&#x529E;&#x6CD5;&#x662F;&#x4ECE; q &#x521B;&#x5EFA;&#x4E00;&#x4E2A;&#x4E34;&#x65F6;&#x7684; shared_ptr &#xFF1A;<br><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">shared_ptr</span>&lt;<span class="keyword">int</span>&gt; p(<span class="keyword">new</span> <span class="keyword">int</span>(<span class="number">5</span>));</span><br><span class="line">weak_ptr&lt;<span class="keyword">int</span>&gt; q(p);</span><br><span class="line"></span><br><span class="line"><span class="comment">// some time later</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span>(<span class="built_in">shared_ptr</span>&lt;<span class="keyword">int</span>&gt; r = q.lock())</span><br><span class="line">{</span><br><span class="line"> <span class="comment">// use *r</span></span><br><span class="line">}</span><br></pre></td></tr></table></figure></p>
<p>&#x90A3;&#x4E48;&#x73B0;&#x5728; r &#x5C31;&#x6709;&#x4E86;&#x4E00;&#x4E2A; q &#x6307;&#x5411;&#x5BF9;&#x8C61;&#x7684;&#x5F15;&#x7528;&#x3002;&#x5373;&#x4F7F; p.reset()&#x5728;&#x53E6;&#x5916;&#x4E00;&#x4E2A;&#x7EBF;&#x7A0B;&#x88AB;&#x6267;&#x884C;&#xFF0C;&#x8FD9;&#x4E2A;&#x5BF9;&#x8C61;&#x4ECD;&#x7136;&#x4F1A;&#x5B58;&#x6D3B;&#xFF0C;&#x76F4;&#x5230; r &#x79BB;&#x5F00;&#x4E86;&#x4F5C;&#x7528;&#x8303;&#x56F4;&#x6216;&#x8005;&#x91CD;&#x65B0;&#x88AB; reset &#x4E86;&#xFF0C;&#x901A;&#x8FC7;&#x83B7;&#x5F97;&#x5BF9;&#x8C61;&#x7684; shared_ptr&#xFF0C;&#x6211;&#x4EEC;&#x80FD;&#x591F;&#x6709;&#x6548;&#x5730;&#x9501;&#x5B9A;&#x5B83;&#x9632;&#x6B62;&#x9500;&#x6BC1;&#x3002; </p>
<h2 id="Synopsis"><a href="#Synopsis" class="headerlink" title="Synopsis"></a>Synopsis</h2><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">namespace</span> boost {</span><br><span class="line"></span><br><span class="line"> <span class="keyword">template</span>&lt;<span class="keyword">class</span> T&gt; <span class="keyword">class</span> weak_ptr {</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span>:</span><br><span class="line"> <span class="keyword">typedef</span> T element_type;</span><br><span class="line"></span><br><span class="line"> weak_ptr();</span><br><span class="line"></span><br><span class="line"> <span class="keyword">template</span>&lt;<span class="keyword">class</span> Y&gt; weak_ptr(<span class="built_in">shared_ptr</span>&lt;Y&gt; <span class="keyword">const</span> &amp; r);</span><br><span class="line"> weak_ptr(weak_ptr <span class="keyword">const</span> &amp; r);</span><br><span class="line"> <span class="keyword">template</span>&lt;<span class="keyword">class</span> Y&gt; weak_ptr(weak_ptr&lt;Y&gt; <span class="keyword">const</span> &amp; r);</span><br><span class="line"></span><br><span class="line"> ~weak_ptr();</span><br><span class="line"></span><br><span class="line"> weak_ptr &amp; <span class="keyword">operator</span>=(weak_ptr <span class="keyword">const</span> &amp; r);</span><br><span class="line"> <span class="keyword">template</span>&lt;<span class="keyword">class</span> Y&gt; weak_ptr &amp; <span class="keyword">operator</span>=(weak_ptr&lt;Y&gt; <span class="keyword">const</span> &amp; r);</span><br><span class="line"> <span class="keyword">template</span>&lt;<span class="keyword">class</span> Y&gt; weak_ptr &amp; <span class="keyword">operator</span>=(<span class="built_in">shared_ptr</span>&lt;Y&gt; <span class="keyword">const</span> &amp; r);</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">long</span> <span class="title">use_count</span><span class="params">()</span> <span class="keyword">const</span></span>;</span><br><span class="line"> <span class="function"><span class="keyword">bool</span> <span class="title">expired</span><span class="params">()</span> <span class="keyword">const</span></span>;</span><br><span class="line"> <span class="built_in">shared_ptr</span>&lt;T&gt; lock() <span class="keyword">const</span>;</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">void</span> <span class="title">reset</span><span class="params">()</span></span>;</span><br><span class="line"> <span class="function"><span class="keyword">void</span> <span class="title">swap</span><span class="params">(weak_ptr&lt;T&gt; &amp; b)</span></span>;</span><br><span class="line"> };</span><br><span class="line"></span><br><span class="line"> <span class="keyword">template</span>&lt;<span class="keyword">class</span> T, <span class="keyword">class</span> U&gt;</span><br><span class="line"> <span class="keyword">bool</span> <span class="keyword">operator</span>&lt;(weak_ptr&lt;T&gt; <span class="keyword">const</span> &amp; a, weak_ptr&lt;U&gt; <span class="keyword">const</span> &amp; b);</span><br><span class="line"></span><br><span class="line"> <span class="keyword">template</span>&lt;<span class="keyword">class</span> T&gt;</span><br><span class="line"> <span class="function"><span class="keyword">void</span> <span class="title">swap</span><span class="params">(weak_ptr&lt;T&gt; &amp; a, weak_ptr&lt;T&gt; &amp; b)</span></span>;</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
<h2 id="Members"><a href="#Members" class="headerlink" title="Members"></a>Members</h2><h3 id="element-type"><a href="#element-type" class="headerlink" title="element_type"></a>element_type</h3><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">typedef</span> T element_type;</span><br></pre></td></tr></table></figure>
<blockquote>
<p>&#x63D0;&#x4F9B;&#x6A21;&#x7248;&#x53C2;&#x6570; T &#x7684;&#x7C7B;&#x578B;</p>
</blockquote>
<h3 id="&#x6784;&#x9020;&#x51FD;&#x6570;"><a href="#&#x6784;&#x9020;&#x51FD;&#x6570;" class="headerlink" title="&#x6784;&#x9020;&#x51FD;&#x6570;"></a>&#x6784;&#x9020;&#x51FD;&#x6570;</h3><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">weak_ptr();</span><br></pre></td></tr></table></figure>
<blockquote>
<p>&#x6548;&#x679C;&#xFF1A;&#x6784;&#x5EFA;&#x4E00;&#x4E2A;&#x7A7A;&#x7684; weak_ptr &#x3002;<br>&#x540E;&#x7F6E;&#x6761;&#x4EF6;&#xFF1A;use_count() == 0&#x3002;<br>&#x629B;&#x51FA;&#xFF1A;&#x65E0;&#x3002;</p>
</blockquote>
<figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">template</span>&lt;<span class="keyword">class</span> Y&gt; weak_ptr(<span class="built_in">shared_ptr</span>&lt;Y&gt; <span class="keyword">const</span> &amp; r);</span><br><span class="line">weak_ptr(weak_ptr <span class="keyword">const</span> &amp; r);</span><br><span class="line"><span class="keyword">template</span>&lt;<span class="keyword">class</span> Y&gt; weak_ptr(weak_ptr&lt;Y&gt; <span class="keyword">const</span> &amp; r);</span><br></pre></td></tr></table></figure>
<blockquote>
<p>&#x6548;&#x679C;&#xFF1A;&#x5982;&#x679C; r &#x662F;&#x7A7A;&#x7684;&#xFF0C;&#x6784;&#x9020;&#x4E00;&#x4E2A;&#x7A7A;&#x7684; weak_ptr&#xFF1B;&#x5426;&#x5219;&#xFF0C;&#x6784;&#x9020;&#x4E00;&#x4E2A; weak_ptr &#x4E0E; r &#x5171;&#x4EAB;&#x6240;&#x6709;&#x6743;&#xFF0C;&#x540C;&#x65F6;&#x5B58;&#x50A8;&#x4E00;&#x4EFD; r &#x4E2D;&#x7684;&#x6307;&#x9488;&#x7684;&#x62F7;&#x8D1D;&#x3002;<br>&#x540E;&#x7F6E;&#x6761;&#x4EF6;&#xFF1A;use_count() == r.use_count()&#x3002;<br>&#x629B;&#x51FA;&#xFF1A;&#x65E0;&#x3002;</p>
</blockquote>
<h3 id="&#x6790;&#x6784;&#x51FD;&#x6570;"><a href="#&#x6790;&#x6784;&#x51FD;&#x6570;" class="headerlink" title="&#x6790;&#x6784;&#x51FD;&#x6570;"></a>&#x6790;&#x6784;&#x51FD;&#x6570;</h3><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">~weak_ptr();</span><br></pre></td></tr></table></figure>
<blockquote>
<p>&#x6548;&#x679C;&#xFF1A;&#x9500;&#x6BC1;&#x8FD9;&#x4E2A; weak_ptr&#xFF0C;&#x4F46;&#x662F;&#x5BF9;&#x5B83;&#x4FDD;&#x5B58;&#x7684;&#x6307;&#x9488;&#x6307;&#x5411;&#x7684;&#x5BF9;&#x8C61;&#x65E0;&#x5F71;&#x54CD;&#x3002;<br>&#x629B;&#x51FA;&#xFF1A;&#x65E0;&#x3002;</p>
</blockquote>
<h3 id="&#x8D4B;&#x503C;&#x51FD;&#x6570;"><a href="#&#x8D4B;&#x503C;&#x51FD;&#x6570;" class="headerlink" title="&#x8D4B;&#x503C;&#x51FD;&#x6570;"></a>&#x8D4B;&#x503C;&#x51FD;&#x6570;</h3><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">weak_ptr &amp; <span class="keyword">operator</span>=(weak_ptr <span class="keyword">const</span> &amp; r);</span><br><span class="line"><span class="keyword">template</span>&lt;<span class="keyword">class</span> Y&gt; weak_ptr &amp; <span class="keyword">operator</span>=(weak_ptr&lt;Y&gt; <span class="keyword">const</span> &amp; r);</span><br><span class="line"><span class="keyword">template</span>&lt;<span class="keyword">class</span> Y&gt; weak_ptr &amp; <span class="keyword">operator</span>=(<span class="built_in">shared_ptr</span>&lt;Y&gt; <span class="keyword">const</span> &amp; r);</span><br></pre></td></tr></table></figure>
<blockquote>
<p>&#x6548;&#x679C;&#xFF1A;&#x7B49;&#x540C;&#x4E8E; weak_ptr(r).swap(*this)&#x3002;<br>&#x629B;&#x51FA;&#xFF1A;&#x65E0;&#x3002;</p>
</blockquote>
<h3 id="use-count"><a href="#use-count" class="headerlink" title="use_count"></a>use_count</h3><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">long</span> <span class="title">use_count</span><span class="params">()</span> <span class="keyword">const</span></span>;</span><br></pre></td></tr></table></figure>
<blockquote>
<p>&#x8FD4;&#x56DE;&#xFF1A;&#x5982;&#x679C;*this&#x4E3A;&#x7A7A;&#xFF0C;0&#xFF1B;&#x5426;&#x5219;&#xFF0C;&#x4E0E; weak_ptr &#x6240;&#x5171;&#x4EAB;&#x6240;&#x6709;&#x6743;&#x7684; shared_ptr &#x7684;&#x6570;&#x76EE;&#x3002;<br>&#x629B;&#x51FA;&#xFF1A;&#x65E0;&#x3002;<br>&#x6CE8;&#x610F;&#xFF1A;use_count() &#x4E0D;&#x662F;&#x9AD8;&#x6548;&#x7684;&#xFF0C;&#x53EA;&#x662F;&#x7528;&#x6765;&#x8C03;&#x8BD5;&#x548C;&#x6D4B;&#x8BD5;&#x3002;</p>
</blockquote>
<h3 id="expired"><a href="#expired" class="headerlink" title="expired"></a>expired</h3><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">bool</span> <span class="title">expired</span><span class="params">()</span> <span class="keyword">const</span></span>;</span><br></pre></td></tr></table></figure>
<blockquote>
<p>&#x8FD4;&#x56DE;&#xFF1A;use_count() == 0&#x3002;<br>&#x629B;&#x51FA;&#xFF1A;&#x65E0;&#x3002;<br>&#x6CE8;&#x610F;&#xFF1A;expired() &#x6BD4; use_count() &#x5FEB;&#x3002;</p>
</blockquote>
<h3 id="lock"><a href="#lock" class="headerlink" title="lock"></a>lock</h3><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">shared_ptr</span>&lt;T&gt; lock() <span class="keyword">const</span>;</span><br></pre></td></tr></table></figure>
<blockquote>
<p>&#x8FD4;&#x56DE;&#xFF1A;expired() ? shared_ptr&lt; T &gt;() : shared_ptr&lt; T &gt;(*this)&#x3002;</p>
</blockquote>
<h3 id="reset"><a href="#reset" class="headerlink" title="reset"></a>reset</h3><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">reset</span><span class="params">()</span></span>;</span><br></pre></td></tr></table></figure>
<blockquote>
<p>&#x6548;&#x679C;&#xFF1A;&#x7B49;&#x4EF7;&#x4E8E; weak_ptr().swap(*this)&#x3002;</p>
</blockquote>
<h3 id="swap"><a href="#swap" class="headerlink" title="swap"></a>swap</h3><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">swap</span><span class="params">(weak_ptr &amp; b)</span></span>;</span><br></pre></td></tr></table></figure>
<blockquote>
<p>&#x6548;&#x679C;&#xFF1A;&#x4EA4;&#x6362;&#x4E24;&#x4E2A;&#x667A;&#x80FD;&#x6307;&#x9488;&#x7684;&#x5185;&#x5BB9;&#x3002;<br>&#x629B;&#x51FA;&#xFF1A;&#x65E0;&#x3002;</p>
</blockquote>
<h2 id="Free-Functions"><a href="#Free-Functions" class="headerlink" title="Free Functions"></a>Free Functions</h2></content>
<summary type="html">
<blockquote>
<p>&#x6700;&#x8FD1;&#x5728;&#x770B;&#x9648;&#x7855;&#x7684;&#x300A;Linux&#x591A;&#x7EBF;&#x7A0B;&#x670D;&#x52A1;&#x7AEF;&#x7F16;&#x7A0B;&#xFF1A;&#x4F7F;&#x7528;muduo C++&#x7F51;&#x7EDC;&#x5E93;&#x300B;&#xFF0C;&#x7B2C;&#x4E00;&#x7AE0;&#x4E2D;&#x91CD;&#x70B9;&#x8BB2;&#x4E86;&#x591A;&#x7EBF;&#x7A0B;&#x4E0B;&#x6307;&#x9488;&#x7684;&#x5904;&#x7406;&#x95EE;&#x9898;&#xFF0C;&#x5176;&#x4E2D;&#x91CD;&#x70B9;&#x662F; shared_ptr &#x4E0E; weak_ptr, &#x4E0A;&#x4E00;&#x7BC7;&#x535A;&#x5BA2;&#x5B66;&#x4E60;&#x4E86; shared_ptr &#x7684;&#x57FA;&#x672C;&#x7528;&#x6CD5; ( <a href="/2016/06/09/shared-ptr&#x7C7B;&#x6A21;&#x7248;/">shared_ptr&#x7C7B;&#x6A21;&#x7248;</a> )&#xFF0C;&#x4ECA;&#x5929;&#x7EE7;&#x7EED;&#x5B66;&#x4E60; weak_ptr &#xFF0C;&#x4EE5;&#x4E0B;&#x662F;&#x5BF9; <a href="http://www.boost.org/doc/libs/1_61_0/libs/smart_ptr/weak_ptr.htm">boost::weak_ptr</a> &#x7684;&#x4E2D;&#x6587;&#x7FFB;&#x8BD1;&#x3002;</p>
</blockquote>
</summary>
<category term="Unix/Linux" scheme="http://deyituo.github.io/categories/Unix-Linux/"/>
<category term="shared_ptr" scheme="http://deyituo.github.io/tags/shared-ptr/"/>
<category term="C++" scheme="http://deyituo.github.io/tags/C/"/>
<category term="boost" scheme="http://deyituo.github.io/tags/boost/"/>
</entry>
<entry>
<title>shared_ptr类模版</title>
<link href="http://deyituo.github.io/2016/06/09/shared-ptr%E7%B1%BB%E6%A8%A1%E7%89%88/"/>
<id>http://deyituo.github.io/2016/06/09/shared-ptr类模版/</id>
<published>2016-06-09T15:25:16.000Z</published>
<updated>2016-06-12T01:23:25.000Z</updated>
<content type="html"><blockquote>
<p>&#x6700;&#x8FD1;&#x5728;&#x770B;&#x9648;&#x7855;&#x7684;&#x300A;Linux&#x591A;&#x7EBF;&#x7A0B;&#x670D;&#x52A1;&#x7AEF;&#x7F16;&#x7A0B;&#xFF1A;&#x4F7F;&#x7528;muduo C++&#x7F51;&#x7EDC;&#x5E93;&#x300B;&#xFF0C;&#x7B2C;&#x4E00;&#x7AE0;&#x4E2D;&#x91CD;&#x70B9;&#x8BB2;&#x4E86;&#x591A;&#x7EBF;&#x7A0B;&#x4E0B;&#x6307;&#x9488;&#x7684;&#x5904;&#x7406;&#x95EE;&#x9898;&#xFF0C;&#x5176;&#x4E2D;&#x91CD;&#x70B9;&#x662F; shared_ptr &#x4E0E; weak_ptr, &#x4F46;&#x4E66;&#x4E2D;&#x5BF9;&#x8FD9;&#x90E8;&#x5206;&#x7684;&#x57FA;&#x7840;&#x4ECB;&#x7ECD;&#x6BD4;&#x8F83;&#x7B80;&#x7565;&#xFF0C;&#x4EE5;&#x524D;&#x770B;&#x8FC7;&#x667A;&#x80FD;&#x6307;&#x9488;&#xFF0C;&#x4F46;&#x4E00;&#x76F4;&#x6CA1;&#x6709;&#x5B8C;&#x6574;&#x5B66;&#x4E60;&#x8FC7;&#xFF0C;&#x56E0;&#x800C;&#x5B66;&#x4E60;&#x7FFB;&#x8BD1;&#x4E86;&#x5B98;&#x65B9;&#x7684;&#x6587;&#x6863;&#x8FDB;&#x884C;&#x5B66;&#x4E60;&#x3002;&#x4EE5;&#x4E0B;&#x662F; <a href="http://www.boost.org/doc/libs/1_61_0/libs/smart_ptr/shared_ptr.htm" target="_blank" rel="external">boost::shared_ptr</a> &#x7684;&#x4E2D;&#x6587;&#x7FFB;&#x8BD1;&#xFF0C;&#x5176;&#x4E2D;&#x4E00;&#x90E8;&#x5206;&#x611F;&#x89C9;&#x4E0D;&#x662F;&#x5F88;&#x91CD;&#x8981;&#x7684;&#x8FD9;&#x91CC;&#x6682;&#x65F6;&#x6CA1;&#x6709;&#x7ED9;&#x51FA;&#x7FFB;&#x8BD1;&#x3002; </p>
</blockquote>
<a id="more"></a>
<h2 id="Introduction"><a href="#Introduction" class="headerlink" title="Introduction"></a>Introduction</h2><p>shared_ptr&#x7C7B;&#x6A21;&#x7248;&#x5B58;&#x50A8;&#x4E86;&#x5982;&#x7528; C++ &#x7684; new &#x8868;&#x8FBE;&#x5F0F;&#x52A8;&#x6001;&#x5206;&#x914D;&#x7684;&#x5BF9;&#x8C61;&#x7684;&#x6307;&#x9488;&#x3002;&#x5F53;&#x6700;&#x540E;&#x4E00;&#x4E2A;&#x6307;&#x5411;&#x8BE5;&#x5BF9;&#x8C61;&#x7684; share_ptr &#x88AB;&#x9500;&#x6BC1;&#x6216;&#x8005;&#x91CD;&#x7F6E;&#x65F6;&#xFF0C;&#x8BE5;&#x5BF9;&#x8C61;&#x88AB;&#x4FDD;&#x8BC1;&#x4E00;&#x5B9A;&#x4F1A;&#x88AB;&#x5220;&#x9664;&#x3002;<br>&#x4F8B;&#x5982;&#xFF1A;<br><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">shared_ptr</span>&lt; X &gt; p1( <span class="keyword">new</span> X );</span><br><span class="line"><span class="built_in">shared_ptr</span>&lt; <span class="keyword">void</span> &gt; p2( <span class="keyword">new</span> <span class="keyword">int</span>(<span class="number">5</span>) );</span><br></pre></td></tr></table></figure></p>
<p>&#x9500;&#x6BC1;&#x65F6;&#xFF0C;&#x4E0D;&#x8BBA;&#x6A21;&#x7248;&#x7684;&#x53C2;&#x6570;&#x4E3A;&#x4F55;&#xFF0C;shared_ptr &#x5C06;&#x5220;&#x9664;&#x5728;&#x6784;&#x9020;&#x65F6;&#x6240;&#x4F20;&#x9012;&#x771F;&#x5B9E;&#x7C7B;&#x578B;&#x7684;&#x6307;&#x9488;&#x3002;&#x5728;&#x7B2C;&#x4E8C;&#x4E2A;&#x4F8B;&#x5B50;&#x4E2D;&#xFF0C;&#x5C3D;&#x7BA1; p2 &#x7C7B;&#x578B;&#x662F; shared_ptr&lt; void &gt;, &#x5B58;&#x50A8;&#x4E86;&#x4E00;&#x4E2A;&#x7C7B;&#x578B;&#x4E3A;void&#xFF0A;&#x7684;&#x6307;&#x9488;&#xFF0C; &#x5F53; p2 &#x88AB;&#x9500;&#x6BC1;&#x6216;&#x8005;&#x88AB;&#x91CD;&#x7F6E;&#xFF0C;&#x5B83;&#x5C06;&#x5BF9;&#x4F20;&#x9012;&#x5230;&#x6784;&#x9020;&#x51FD;&#x6570;&#x7684; int&#xFF0A; &#x8C03;&#x7528;delete&#x51FD;&#x6570;&#x3002;</p>
<h3 id="&#x57FA;&#x672C;&#x6210;&#x5458;&#x51FD;&#x6570;"><a href="#&#x57FA;&#x672C;&#x6210;&#x5458;&#x51FD;&#x6570;" class="headerlink" title="&#x57FA;&#x672C;&#x6210;&#x5458;&#x51FD;&#x6570;"></a>&#x57FA;&#x672C;&#x6210;&#x5458;&#x51FD;&#x6570;</h3><p>shared_ptr &#x62E5;&#x6709;&#x62F7;&#x8D1D;&#x6784;&#x9020;&#x51FD;&#x6570;&#xFF0C;Move&#x6784;&#x9020;&#x51FD;&#x6570;&#xFF0C;&#x62F7;&#x8D1D;&#x8D4B;&#x503C;&#x51FD;&#x6570;&#xFF0C;Move&#x8D4B;&#x503C;&#x51FD;&#x6570;&#xFF0C;&#x5E76;&#x4E14;&#x80FD;&#x7528;&#x5728;&#x6807;&#x51C6;&#x5E93;&#x7684;&#x5BB9;&#x5668;&#x91CC;&#x3002;&#x5BF9;&#x6BD4;&#x64CD;&#x4F5C;&#x7B26;&#x540C;&#x6837;&#x4E5F;&#x63D0;&#x4F9B;&#xFF0C;&#x4F7F;&#x5F97; shared_ptr &#x80FD;&#x7528;&#x5728;&#x6807;&#x51C6;&#x5E93;&#x4E2D;&#x7684;&#x5173;&#x8054;&#x5BB9;&#x5668;&#x91CC;&#x3002;&#xFF08;&#x5173;&#x8054;&#x5BB9;&#x5668;&#xFF1F;&#xFF09;</p>
<h3 id="&#x5FAA;&#x73AF;&#x5D4C;&#x5957;&#x95EE;&#x9898;"><a href="#&#x5FAA;&#x73AF;&#x5D4C;&#x5957;&#x95EE;&#x9898;" class="headerlink" title="&#x5FAA;&#x73AF;&#x5D4C;&#x5957;&#x95EE;&#x9898;"></a>&#x5FAA;&#x73AF;&#x5D4C;&#x5957;&#x95EE;&#x9898;</h3><p>&#x56E0;&#x4E3A;&#x4F7F;&#x7528;&#x4E86;&#x5F15;&#x7528;&#x8BA1;&#x6570;&#x6765;&#x4F5C;&#x4E3A;&#x5176;&#x5B9E;&#x73B0;&#xFF0C;&#x56E0;&#x6B64;&#x5FAA;&#x73AF;&#x5D4C;&#x5957; shared_ptr &#x7684;&#x5B9E;&#x4F53;&#x5C06;&#x4E0D;&#x4F1A;&#x88AB;&#x56DE;&#x6536;&#x3002; &#x4F8B;&#x5982;&#xFF0C;&#x5982;&#x679C; main() &#x6709;&#x4E00;&#x4E2A;&#x6307;&#x5411;&#x5BF9;&#x8C61; A &#x7684; shared_ptr&#xFF0C;&#x800C; A &#x81EA;&#x8EAB;&#x53C8;&#x76F4;&#x63A5;&#x6216;&#x8005;&#x95F4;&#x63A5;&#x5730;&#x62E5;&#x6709;&#x4E00;&#x4E2A;&#x6307;&#x5411; A &#x7684; shared_ptr&#xFF0C;&#x90A3;&#x4E48; A &#x7684;&#x5F15;&#x7528;&#x8BA1;&#x6570;&#x5C06;&#x4E3A; 2&#x3002;&#x9500;&#x6BC1; main() &#x4E2D;&#x7684; shared_ptr &#x5C06;&#x4F7F;&#x5F97; A &#x7684;&#x5F15;&#x7528;&#x8BA1;&#x6570;&#x4E3A; 1&#x3002;&#xFF08;&#x4F7F;&#x7528; <a href="http://www.boost.org/doc/libs/1_61_0/libs/smart_ptr/weak_ptr.htm" target="_blank" rel="external">weak_ptr</a> &#x6253;&#x7834;&#x5FAA;&#x73AF;&#xFF1F;&#xFF09;</p>
<h3 id="void-&#x6A21;&#x7248;&#x53C2;&#x6570;"><a href="#void-&#x6A21;&#x7248;&#x53C2;&#x6570;" class="headerlink" title="void &#x6A21;&#x7248;&#x53C2;&#x6570;"></a>void &#x6A21;&#x7248;&#x53C2;&#x6570;</h3><p>shared_ptr &#x4F7F;&#x7528; T &#x6765;&#x8868;&#x660E;&#x6240;&#x6307;&#x5411;&#x7684;&#x5BF9;&#x8C61;&#x7684;&#x7C7B;&#x578B;&#xFF0C;&#x5B83;&#x53CA;&#x5B83;&#x7684;&#x5F88;&#x591A;&#x6210;&#x5458;&#x51FD;&#x6570;&#x5E76;&#x4E0D;&#x9700;&#x8981;&#x4F7F;&#x7528;&#x5230; T&#xFF1B;&#x5B83;&#x88AB;&#x5141;&#x8BB8;&#x662F;&#x4E00;&#x4E2A;&#x4E0D;&#x5B8C;&#x6574;&#x7684;&#x7C7B;&#x578B;&#xFF0C;&#x6216;&#x8005; void&#xFF0C;&#x9700;&#x8981;&#x4F7F;&#x7528;&#x5230; T &#x7684;&#x6210;&#x5458;&#x51FD;&#x6570;&#x5C06;&#x5728;&#x4E0B;&#x9762;&#x6587;&#x6863;&#x4E2D;&#x4ECB;&#x7ECD;&#x3002;</p>
<h3 id="&#x8F6C;&#x6362;"><a href="#&#x8F6C;&#x6362;" class="headerlink" title="&#x8F6C;&#x6362;"></a>&#x8F6C;&#x6362;</h3><p>shared_ptr&lt; T &gt; &#x80FD;&#x88AB;&#x9690;&#x5F0F;&#x5730;&#x8F6C;&#x6362;&#x5230; shared_ptr&lt; U &gt;&#xFF0C;T&#xFF0A; &#x80FD;&#x88AB;&#x9690;&#x5F0F;&#x8F6C;&#x6362;&#x5230; U&#xFF0A;&#x3002;&#x7279;&#x522B;&#x5730;&#xFF0C; shared_ptr&lt; T &gt; &#x80FD;&#x88AB;&#x9690;&#x5F0F;&#x8F6C;&#x6362;&#x4E3A; shared_ptr&lt; T const &gt;&#xFF1B;&#x5F53; U &#x662F; T &#x7684;&#x57FA;&#x7C7B;&#x65F6;&#xFF0C; &#x80FD;&#x88AB;&#x8F6C;&#x6362;&#x5230; shared_ptr&lt; U &gt;&#xFF1B;&#x8F6C;&#x6362;&#x5230; shared_ptr&lt; void &gt;&#x3002;</p>
<h3 id="std-shared-ptr"><a href="#std-shared-ptr" class="headerlink" title="std::shared_ptr"></a>std::shared_ptr</h3><p>shared_ptr &#x662F; C++11 &#x4E00;&#x90E8;&#x5206;&#xFF0C;&#x4E3A; std::shared_ptr&#x3002;</p>
<h3 id="&#x6570;&#x7EC4;&#x6307;&#x9488;"><a href="#&#x6570;&#x7EC4;&#x6307;&#x9488;" class="headerlink" title="&#x6570;&#x7EC4;&#x6307;&#x9488;"></a>&#x6570;&#x7EC4;&#x6307;&#x9488;</h3><p>&#x4ECE; Boost 1.53 &#x5F00;&#x59CB;&#xFF0C;shared_ptr &#x80FD;&#x591F;&#x4FDD;&#x5B58;&#x6307;&#x5411;&#x52A8;&#x6001;&#x5206;&#x914D;&#x6570;&#x7EC4;&#x7684;&#x6307;&#x9488;&#xFF0C;&#x6A21;&#x7248;&#x53C2;&#x6570;&#x4E3A; T[] &#x6216;&#x8005; T[N]&#xFF0C;&#x4E24;&#x8005;&#x95F4;&#x51E0;&#x4E4E;&#x6CA1;&#x4EC0;&#x4E48;&#x5DEE;&#x522B;&#xFF0C;&#x540E;&#x8005;&#x80FD;&#x591F;&#x68C0;&#x67E5;&#x8FDB;&#x884C;&#x4E0B;&#x6807;&#x7684;&#x8303;&#x56F4;&#x3002;<br>&#x4F8B;&#x5982;&#xFF1A;<br><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">shared_ptr</span>&lt; <span class="keyword">double</span>[ <span class="number">1024</span> ] &gt; p1( <span class="keyword">new</span> <span class="keyword">double</span>[ <span class="number">1024</span> ])</span><br><span class="line"><span class="built_in">shared_ptr</span>&lt; <span class="keyword">double</span>[] &gt; p2( <span class="keyword">new</span> <span class="keyword">double</span>[n] )</span><br></pre></td></tr></table></figure></p>
<h2 id="Best-practices"><a href="#Best-practices" class="headerlink" title="Best practices"></a>Best practices</h2><p>&#x53BB;&#x9664;&#x5185;&#x5B58;&#x6CC4;&#x6F0F;&#x7684;&#x4E00;&#x4E2A;&#x7B80;&#x5355;&#x65B9;&#x6CD5;&#x662F;&#xFF1A;&#x603B;&#x662F;&#x4F7F;&#x7528;&#x4E00;&#x4E2A;&#x667A;&#x80FD;&#x6307;&#x9488;&#x53BB;&#x5B58;&#x50A8; new &#x7684;&#x7ED3;&#x679C;&#x3002;&#x6BCF;&#x4E2A; new &#x5173;&#x952E;&#x5B57;&#x51FA;&#x73B0;&#x7684;&#x5730;&#x65B9;&#x5E94;&#x8BE5;&#x6709;&#x5982;&#x4E0B;&#x7684;&#x5F62;&#x5F0F;&#xFF1A;<br><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">shared_ptr</span>&lt; T &gt; p( <span class="keyword">new</span> Y );</span><br></pre></td></tr></table></figure></p>
<p>&#x8FD9;&#x91CC; shared_ptr &#x53EF;&#x4EE5;&#x7528;&#x5176;&#x4ED6;&#x4EE5;&#x5916;&#x7684;&#x667A;&#x80FD;&#x6307;&#x9488;&#x4EE3;&#x66FF;&#xFF1B; T &#x548C; Y &#x53EF;&#x4EE5;&#x662F;&#x76F8;&#x540C;&#x7684;&#x7C7B;&#x578B;&#xFF0C;Y &#x7684;&#x6784;&#x9020;&#x51FD;&#x6570;&#x4E5F;&#x53EF;&#x4EE5;&#x4F5C;&#x4E3A;&#x4F20;&#x9012;&#x7684;&#x53C2;&#x6570;&#x3002;</p>
<p>&#x5982;&#x679C;&#x4F60;&#x4ED4;&#x7EC6;&#x89C2;&#x5BDF;&#xFF0C;&#x4F60;&#x53D1;&#x73B0;&#x8FD9;&#x91CC;&#x4E0D;&#x9700;&#x8981;&#x4F7F;&#x7528; delete &#x8BED;&#x53E5;&#xFF0C;try&#xFF0F;catch &#x4E5F;&#x5F88;&#x5C11;&#x3002;</p>
<p>&#x907F;&#x514D;&#x4F7F;&#x7528;&#x672A;&#x547D;&#x540D;&#x7684;&#x4E34;&#x65F6; shared_ptr &#x8282;&#x7701;&#x4EE3;&#x7801;&#x4E66;&#x5199;&#xFF0C;&#x4E3A;&#x8BF4;&#x660E;&#x8FD9;&#x4E2A;&#x95EE;&#x9898;&#xFF0C;&#x8003;&#x8651;&#x4E0B;&#x9762;&#x8FD9;&#x4E2A;&#x4F8B;&#x5B50;&#xFF1A;<br><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">f</span><span class="params">( <span class="built_in">shared_ptr</span>&lt; <span class="keyword">int</span> &gt;, <span class="keyword">int</span>)</span></span>;</span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">g</span><span class="params">()</span></span>;</span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">ok</span><span class="params">()</span></span><br><span class="line"></span>{</span><br><span class="line"> <span class="built_in">shared_ptr</span>&lt; <span class="keyword">int</span> &gt; p( <span class="keyword">new</span> <span class="keyword">int</span>(<span class="number">2</span>) );</span><br><span class="line"> f( p, g() );</span><br><span class="line">}</span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">bad</span><span class="params">()</span></span><br><span class="line"></span>{</span><br><span class="line"> f( <span class="built_in">shared_ptr</span>&lt; <span class="keyword">int</span> &gt;( <span class="keyword">new</span> <span class="keyword">int</span>(<span class="number">2</span>)), g() );</span><br><span class="line">}</span><br></pre></td></tr></table></figure></p>
<p>ok&#x51FD;&#x6570;&#x4F7F;&#x7528;&#x4E86;&#x6BD4;&#x8F83;&#x597D;&#x7684;&#x65B9;&#x5F0F;&#xFF0C;&#x800C; bad &#x51FD;&#x6570;&#x4F7F;&#x7528;&#x4E86;&#x4E34;&#x65F6;&#x7684; shared_ptr&#xFF0C;&#x5BFC;&#x81F4;&#x4E86;&#x5185;&#x5B58;&#x6CC4;&#x6F0F;&#x7684;&#x53EF;&#x80FD;&#x3002;&#x56E0;&#x4E3A;&#x51FD;&#x6570;&#x53C2;&#x6570;&#x7684;&#x8BA1;&#x7B97;&#x6CA1;&#x6709;&#x6307;&#x5B9A;&#x987A;&#x5E8F;&#xFF0C;&#x53EF;&#x80FD; new int(2) &#x4F1A;&#x9996;&#x5148;&#x6267;&#x884C;&#xFF0C;&#x7136;&#x540E; g()&#xFF0C;&#x4F46;&#x5982;&#x679C;&#x51FD;&#x6570; g &#x5728;&#x6267;&#x884C;&#x662F;&#x629B;&#x51FA;&#x4E86;&#x5F02;&#x5E38;&#xFF0C;&#x90A3;&#x4E48;&#x6211;&#x4EEC;&#x5C06;&#x65E0;&#x6CD5;&#x8C03;&#x7528; shared_ptr &#x7684;&#x6784;&#x9020;&#x51FD;&#x6570;&#x3002; &#x94FE;&#x63A5; Herb Sutter&#x2019;s treatment (&#x53CA;here) &#x5BF9;&#x8FD9;&#x4E2A;&#x95EE;&#x9898;&#x6709;&#x66F4;&#x591A;&#x7684;&#x8BF4;&#x660E;&#x3002;</p>
<p>&#x4E0A;&#x8FF0;&#x63CF;&#x8FF0;&#x7684;&#x5F02;&#x5E38;&#x5B89;&#x5168;&#x95EE;&#x9898;&#x4E5F;&#x80FD;&#x901A;&#x8FC7;&#x4F7F;&#x7528; make_shared &#x6216;&#x8005; allocate_shared &#x5DE5;&#x5382;&#x51FD;&#x6570;&#x88AB;&#x6392;&#x9664;&#xFF08;&#x5B9A;&#x4E49;&#x5728; boost/make_shared.hpp&#xFF09;&#x3002;&#x8FD9;&#x4E9B;&#x5DE5;&#x5382;&#x51FD;&#x6570;&#x901A;&#x8FC7;&#x6574;&#x5408;&#x5185;&#x5B58;&#x52A0;&#x5FEB;&#x4E86;&#x7A0B;&#x5E8F;&#x7684;&#x6548;&#x7387;&#x3002;</p>
<h2 id="Synopsis"><a href="#Synopsis" class="headerlink" title="Synopsis"></a>Synopsis</h2><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">namespace</span> boost {</span><br><span class="line"></span><br><span class="line"> <span class="keyword">class</span> bad_weak_ptr: <span class="keyword">public</span> <span class="built_in">std</span>::exception;</span><br><span class="line"></span><br><span class="line"> <span class="keyword">template</span>&lt;<span class="keyword">class</span> T&gt; <span class="keyword">class</span> weak_ptr;</span><br><span class="line"></span><br><span class="line"> <span class="keyword">template</span>&lt;<span class="keyword">class</span> T&gt; <span class="keyword">class</span> <span class="built_in">shared_ptr</span> {</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span>:</span><br><span class="line"></span><br><span class="line"> <span class="keyword">typedef</span> see below element_type;</span><br><span class="line"></span><br><span class="line"> <span class="built_in">shared_ptr</span>(); <span class="comment">// never throws</span></span><br><span class="line"> <span class="built_in">shared_ptr</span>(<span class="built_in">std</span>::<span class="keyword">nullptr_t</span>); <span class="comment">// never throws</span></span><br><span class="line"></span><br><span class="line"> <span class="keyword">template</span>&lt;<span class="keyword">class</span> Y&gt; <span class="function"><span class="keyword">explicit</span> <span class="title">shared_ptr</span><span class="params">(Y * p)</span></span>;</span><br><span class="line"> <span class="keyword">template</span>&lt;<span class="keyword">class</span> Y, <span class="keyword">class</span> D&gt; <span class="built_in">shared_ptr</span>(Y * p, D d);</span><br><span class="line"> <span class="keyword">template</span>&lt;<span class="keyword">class</span> Y, <span class="keyword">class</span> D, <span class="keyword">class</span> A&gt; <span class="built_in">shared_ptr</span>(Y * p, D d, A a);</span><br><span class="line"> <span class="keyword">template</span>&lt;<span class="keyword">class</span> D&gt; <span class="built_in">shared_ptr</span>(<span class="built_in">std</span>::<span class="keyword">nullptr_t</span> p, D d);</span><br><span class="line"> <span class="keyword">template</span>&lt;<span class="keyword">class</span> D, <span class="keyword">class</span> A&gt; <span class="built_in">shared_ptr</span>(<span class="built_in">std</span>::<span class="keyword">nullptr_t</span> p, D d, A a);</span><br><span class="line"></span><br><span class="line"> ~<span class="built_in">shared_ptr</span>(); <span class="comment">// never throws</span></span><br><span class="line"></span><br><span class="line"> <span class="built_in">shared_ptr</span>(<span class="built_in">shared_ptr</span> <span class="keyword">const</span> &amp; r); <span class="comment">// never throws</span></span><br><span class="line"> <span class="keyword">template</span>&lt;<span class="keyword">class</span> Y&gt; <span class="built_in">shared_ptr</span>(<span class="built_in">shared_ptr</span>&lt;Y&gt; <span class="keyword">const</span> &amp; r); <span class="comment">// never throws</span></span><br><span class="line"></span><br><span class="line"> <span class="built_in">shared_ptr</span>(<span class="built_in">shared_ptr</span> &amp;&amp; r); <span class="comment">// never throws</span></span><br><span class="line"> <span class="keyword">template</span>&lt;<span class="keyword">class</span> Y&gt; <span class="built_in">shared_ptr</span>(<span class="built_in">shared_ptr</span>&lt;Y&gt; &amp;&amp; r); <span class="comment">// never throws</span></span><br><span class="line"></span><br><span class="line"> <span class="keyword">template</span>&lt;<span class="keyword">class</span> Y&gt; <span class="built_in">shared_ptr</span>(<span class="built_in">shared_ptr</span>&lt;Y&gt; <span class="keyword">const</span> &amp; r, element_type * p); <span class="comment">// never throws</span></span><br><span class="line"></span><br><span class="line"> <span class="keyword">template</span>&lt;<span class="keyword">class</span> Y&gt; <span class="function"><span class="keyword">explicit</span> <span class="title">shared_ptr</span><span class="params">(weak_ptr&lt;Y&gt; <span class="keyword">const</span> &amp; r)</span></span>;</span><br><span class="line"></span><br><span class="line"> <span class="keyword">template</span>&lt;<span class="keyword">class</span> Y&gt; <span class="function"><span class="keyword">explicit</span> <span class="title">shared_ptr</span><span class="params">(<span class="built_in">std</span>::<span class="built_in">auto_ptr</span>&lt;Y&gt; &amp; r)</span></span>;</span><br><span class="line"> <span class="keyword">template</span>&lt;<span class="keyword">class</span> Y&gt; <span class="built_in">shared_ptr</span>(<span class="built_in">std</span>::<span class="built_in">auto_ptr</span>&lt;Y&gt; &amp;&amp; r);</span><br><span class="line"></span><br><span class="line"> <span class="keyword">template</span>&lt;<span class="keyword">class</span> Y, <span class="keyword">class</span> D&gt; <span class="built_in">shared_ptr</span>(<span class="built_in">std</span>::<span class="built_in">unique_ptr</span>&lt;Y, D&gt; &amp;&amp; r);</span><br><span class="line"></span><br><span class="line"> <span class="built_in">shared_ptr</span> &amp; <span class="keyword">operator</span>=(<span class="built_in">shared_ptr</span> <span class="keyword">const</span> &amp; r); <span class="comment">// never throws</span></span><br><span class="line"> <span class="keyword">template</span>&lt;<span class="keyword">class</span> Y&gt; <span class="built_in">shared_ptr</span> &amp; <span class="keyword">operator</span>=(<span class="built_in">shared_ptr</span>&lt;Y&gt; <span class="keyword">const</span> &amp; r); <span class="comment">// never throws</span></span><br><span class="line"></span><br><span class="line"> <span class="built_in">shared_ptr</span> &amp; <span class="keyword">operator</span>=(<span class="built_in">shared_ptr</span> <span class="keyword">const</span> &amp;&amp; r); <span class="comment">// never throws</span></span><br><span class="line"> <span class="keyword">template</span>&lt;<span class="keyword">class</span> Y&gt; <span class="built_in">shared_ptr</span> &amp; <span class="keyword">operator</span>=(<span class="built_in">shared_ptr</span>&lt;Y&gt; <span class="keyword">const</span> &amp;&amp; r); <span class="comment">// never throws</span></span><br><span class="line"></span><br><span class="line"> <span class="keyword">template</span>&lt;<span class="keyword">class</span> Y&gt; <span class="built_in">shared_ptr</span> &amp; <span class="keyword">operator</span>=(<span class="built_in">std</span>::<span class="built_in">auto_ptr</span>&lt;Y&gt; &amp; r);</span><br><span class="line"> <span class="keyword">template</span>&lt;<span class="keyword">class</span> Y&gt; <span class="built_in">shared_ptr</span> &amp; <span class="keyword">operator</span>=(<span class="built_in">std</span>::<span class="built_in">auto_ptr</span>&lt;Y&gt; &amp;&amp; r);</span><br><span class="line"></span><br><span class="line"> <span class="keyword">template</span>&lt;<span class="keyword">class</span> Y, <span class="keyword">class</span> D&gt; <span class="built_in">shared_ptr</span> &amp; <span class="keyword">operator</span>=(<span class="built_in">std</span>::<span class="built_in">unique_ptr</span>&lt;Y, D&gt; &amp;&amp; r);</span><br><span class="line"></span><br><span class="line"> <span class="built_in">shared_ptr</span> &amp; <span class="keyword">operator</span>=(<span class="built_in">std</span>::<span class="keyword">nullptr_t</span>); <span class="comment">// never throws</span></span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">void</span> <span class="title">reset</span><span class="params">()</span></span>; <span class="comment">// never throws</span></span><br><span class="line"></span><br><span class="line"> <span class="keyword">template</span>&lt;<span class="keyword">class</span> Y&gt; <span class="function"><span class="keyword">void</span> <span class="title">reset</span><span class="params">(Y * p)</span></span>;</span><br><span class="line"> <span class="keyword">template</span>&lt;<span class="keyword">class</span> Y, <span class="keyword">class</span> D&gt; <span class="function"><span class="keyword">void</span> <span class="title">reset</span><span class="params">(Y * p, D d)</span></span>;</span><br><span class="line"> <span class="keyword">template</span>&lt;<span class="keyword">class</span> Y, <span class="keyword">class</span> D, <span class="keyword">class</span> A&gt; <span class="function"><span class="keyword">void</span> <span class="title">reset</span><span class="params">(Y * p, D d, A a)</span></span>;</span><br><span class="line"></span><br><span class="line"> <span class="keyword">template</span>&lt;<span class="keyword">class</span> Y&gt; <span class="function"><span class="keyword">void</span> <span class="title">reset</span><span class="params">(<span class="built_in">shared_ptr</span>&lt;Y&gt; <span class="keyword">const</span> &amp; r, element_type * p)</span></span>; <span class="comment">// never throws</span></span><br><span class="line"></span><br><span class="line"> T &amp; <span class="keyword">operator</span>*() <span class="keyword">const</span>; <span class="comment">// never throws; only valid when T is not an array type</span></span><br><span class="line"> T * <span class="keyword">operator</span>-&gt;() <span class="keyword">const</span>; <span class="comment">// never throws; only valid when T is not an array type</span></span><br><span class="line"></span><br><span class="line"> element_type &amp; <span class="keyword">operator</span>[](<span class="built_in">std</span>::<span class="keyword">ptrdiff_t</span> i) <span class="keyword">const</span>; <span class="comment">// never throws; only valid when T is an array type</span></span><br><span class="line"></span><br><span class="line"> <span class="function">element_type * <span class="title">get</span><span class="params">()</span> <span class="keyword">const</span></span>; <span class="comment">// never throws</span></span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">bool</span> <span class="title">unique</span><span class="params">()</span> <span class="keyword">const</span></span>; <span class="comment">// never throws</span></span><br><span class="line"> <span class="function"><span class="keyword">long</span> <span class="title">use_count</span><span class="params">()</span> <span class="keyword">const</span></span>; <span class="comment">// never throws</span></span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">explicit</span> <span class="keyword">operator</span> <span class="title">bool</span><span class="params">()</span> <span class="keyword">const</span></span>; <span class="comment">// never throws</span></span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">void</span> <span class="title">swap</span><span class="params">(<span class="built_in">shared_ptr</span> &amp; b)</span></span>; <span class="comment">// never throws</span></span><br><span class="line"> </span><br><span class="line"> <span class="keyword">template</span>&lt;<span class="keyword">class</span> Y&gt; <span class="function"><span class="keyword">bool</span> <span class="title">owner_before</span><span class="params">(<span class="built_in">shared_ptr</span>&lt;Y&gt; <span class="keyword">const</span> &amp; rhs)</span> <span class="keyword">const</span></span>; <span class="comment">// never throws</span></span><br><span class="line"> <span class="keyword">template</span>&lt;<span class="keyword">class</span> Y&gt; <span class="function"><span class="keyword">bool</span> <span class="title">owner_before</span><span class="params">(weak_ptr&lt;Y&gt; <span class="keyword">const</span> &amp; rhs)</span> <span class="keyword">const</span></span>; <span class="comment">// never throws</span></span><br><span class="line"> };</span><br><span class="line"></span><br><span class="line"> <span class="keyword">template</span>&lt;<span class="keyword">class</span> T, <span class="keyword">class</span> U&gt;</span><br><span class="line"> <span class="keyword">bool</span> <span class="keyword">operator</span>==(<span class="built_in">shared_ptr</span>&lt;T&gt; <span class="keyword">const</span> &amp; a, <span class="built_in">shared_ptr</span>&lt;U&gt; <span class="keyword">const</span> &amp; b); <span class="comment">// never throws</span></span><br><span class="line"></span><br><span class="line"> <span class="keyword">template</span>&lt;<span class="keyword">class</span> T, <span class="keyword">class</span> U&gt;</span><br><span class="line"> <span class="keyword">bool</span> <span class="keyword">operator</span>!=(<span class="built_in">shared_ptr</span>&lt;T&gt; <span class="keyword">const</span> &amp; a, <span class="built_in">shared_ptr</span>&lt;U&gt; <span class="keyword">const</span> &amp; b); <span class="comment">// never throws</span></span><br><span class="line"></span><br><span class="line"> <span class="keyword">template</span>&lt;<span class="keyword">class</span> T, <span class="keyword">class</span> U&gt;</span><br><span class="line"> <span class="keyword">bool</span> <span class="keyword">operator</span>&lt;(<span class="built_in">shared_ptr</span>&lt;T&gt; <span class="keyword">const</span> &amp; a, <span class="built_in">shared_ptr</span>&lt;U&gt; <span class="keyword">const</span> &amp; b); <span class="comment">// never throws</span></span><br><span class="line"></span><br><span class="line"> <span class="keyword">template</span>&lt;<span class="keyword">class</span> T&gt;</span><br><span class="line"> <span class="keyword">bool</span> <span class="keyword">operator</span>==(<span class="built_in">shared_ptr</span>&lt;T&gt; <span class="keyword">const</span> &amp; p, <span class="built_in">std</span>::<span class="keyword">nullptr_t</span>); <span class="comment">// never throws</span></span><br><span class="line"></span><br><span class="line"> <span class="keyword">template</span>&lt;<span class="keyword">class</span> T&gt;</span><br><span class="line"> <span class="keyword">bool</span> <span class="keyword">operator</span>==(<span class="built_in">std</span>::<span class="keyword">nullptr_t</span>, <span class="built_in">shared_ptr</span>&lt;T&gt; <span class="keyword">const</span> &amp; p); <span class="comment">// never throws</span></span><br><span class="line"></span><br><span class="line"> <span class="keyword">template</span>&lt;<span class="keyword">class</span> T&gt;</span><br><span class="line"> <span class="keyword">bool</span> <span class="keyword">operator</span>!=(<span class="built_in">shared_ptr</span>&lt;T&gt; <span class="keyword">const</span> &amp; p, <span class="built_in">std</span>::<span class="keyword">nullptr_t</span>); <span class="comment">// never throws</span></span><br><span class="line"></span><br><span class="line"> <span class="keyword">template</span>&lt;<span class="keyword">class</span> T&gt;</span><br><span class="line"> <span class="keyword">bool</span> <span class="keyword">operator</span>!=(<span class="built_in">std</span>::<span class="keyword">nullptr_t</span>, <span class="built_in">shared_ptr</span>&lt;T&gt; <span class="keyword">const</span> &amp; p); <span class="comment">// never throws</span></span><br><span class="line"></span><br><span class="line"> <span class="keyword">template</span>&lt;<span class="keyword">class</span> T&gt; <span class="function"><span class="keyword">void</span> <span class="title">swap</span><span class="params">(<span class="built_in">shared_ptr</span>&lt;T&gt; &amp; a, <span class="built_in">shared_ptr</span>&lt;T&gt; &amp; b)</span></span>; <span class="comment">// never throws</span></span><br><span class="line"></span><br><span class="line"> <span class="keyword">template</span>&lt;<span class="keyword">class</span> T&gt; <span class="keyword">typename</span> <span class="built_in">shared_ptr</span>&lt;T&gt;::<span class="function">element_type * <span class="title">get_pointer</span><span class="params">(<span class="built_in">shared_ptr</span>&lt;T&gt; <span class="keyword">const</span> &amp; p)</span></span>; <span class="comment">// never throws</span></span><br><span class="line"></span><br><span class="line"> <span class="keyword">template</span>&lt;<span class="keyword">class</span> T, <span class="keyword">class</span> U&gt;</span><br><span class="line"> <span class="built_in">shared_ptr</span>&lt;T&gt; static_pointer_cast(<span class="built_in">shared_ptr</span>&lt;U&gt; <span class="keyword">const</span> &amp; r); <span class="comment">// never throws</span></span><br><span class="line"></span><br><span class="line"> <span class="keyword">template</span>&lt;<span class="keyword">class</span> T, <span class="keyword">class</span> U&gt;</span><br><span class="line"> <span class="built_in">shared_ptr</span>&lt;T&gt; const_pointer_cast(<span class="built_in">shared_ptr</span>&lt;U&gt; <span class="keyword">const</span> &amp; r); <span class="comment">// never throws</span></span><br><span class="line"></span><br><span class="line"> <span class="keyword">template</span>&lt;<span class="keyword">class</span> T, <span class="keyword">class</span> U&gt;</span><br><span class="line"> <span class="built_in">shared_ptr</span>&lt;T&gt; dynamic_pointer_cast(<span class="built_in">shared_ptr</span>&lt;U&gt; <span class="keyword">const</span> &amp; r); <span class="comment">// never throws</span></span><br><span class="line"></span><br><span class="line"> <span class="keyword">template</span>&lt;<span class="keyword">class</span> T, <span class="keyword">class</span> U&gt;</span><br><span class="line"> <span class="built_in">shared_ptr</span>&lt;T&gt; reinterpet_pointer_cast(<span class="built_in">shared_ptr</span>&lt;U&gt; <span class="keyword">const</span> &amp; r); <span class="comment">// never throws</span></span><br><span class="line"></span><br><span class="line"> <span class="keyword">template</span>&lt;<span class="keyword">class</span> E, <span class="keyword">class</span> T, <span class="keyword">class</span> Y&gt;</span><br><span class="line"> <span class="built_in">std</span>::basic_ostream&lt;E, T&gt; &amp; <span class="keyword">operator</span>&lt;&lt; (<span class="built_in">std</span>::basic_ostream&lt;E, T&gt; &amp; os, <span class="built_in">shared_ptr</span>&lt;Y&gt; <span class="keyword">const</span> &amp; p);</span><br><span class="line"></span><br><span class="line"> <span class="keyword">template</span>&lt;<span class="keyword">class</span> D, <span class="keyword">class</span> T&gt;</span><br><span class="line"> <span class="function">D * <span class="title">get_deleter</span><span class="params">(<span class="built_in">shared_ptr</span>&lt;T&gt; <span class="keyword">const</span> &amp; p)</span></span>;</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
<h2 id="Members"><a href="#Members" class="headerlink" title="Members"></a>Members</h2><h3 id="element-type"><a href="#element-type" class="headerlink" title="element_type"></a>element_type</h3><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">typedef</span> ... element_type;</span><br></pre></td></tr></table></figure>
<blockquote>
<p>&#x5F53; T &#x4E0D;&#x662F;&#x6570;&#x7EC4;&#x7C7B;&#x578B;&#x65F6;&#xFF0C;element_type &#x662F; T&#xFF1B;&#x5F53; T &#x662F; U[] &#x6216;&#x8005; U[N] &#x65F6;&#xFF0C;element_type &#x662F; U</p>
</blockquote>
<h3 id="&#x9ED8;&#x8BA4;&#x6784;&#x9020;&#x51FD;&#x6570;"><a href="#&#x9ED8;&#x8BA4;&#x6784;&#x9020;&#x51FD;&#x6570;" class="headerlink" title="&#x9ED8;&#x8BA4;&#x6784;&#x9020;&#x51FD;&#x6570;"></a>&#x9ED8;&#x8BA4;&#x6784;&#x9020;&#x51FD;&#x6570;</h3><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">shared_ptr</span>(); <span class="comment">// never throws</span></span><br><span class="line"><span class="built_in">shared_ptr</span>(<span class="built_in">std</span>::<span class="keyword">nullptr_t</span>); <span class="comment">// never throws</span></span><br></pre></td></tr></table></figure>
<blockquote>
<p>&#x6548;&#x679C;&#xFF1A;&#x521B;&#x5EFA;&#x4E00;&#x4E2A;&#x7A7A;&#x7684; shared_ptr&#x3002;<br>&#x540E;&#x7F6E;&#x6761;&#x4EF6;&#xFF1A;use_count() == 0 &amp;&amp; get() == 0&#x3002;<br>&#x629B;&#x51FA;&#xFF1A;&#x65E0;&#x3002;</p>
</blockquote>
<p>&#x4FDD;&#x8BC1; nothrows &#x662F;&#x91CD;&#x8981;&#x7684;&#xFF0C;&#x56E0;&#x4E3A; reset() &#x901A;&#x8FC7;&#x9ED8;&#x8BA4;&#x6784;&#x9020;&#x51FD;&#x6570;&#x6765;&#x6307;&#x5B9A;&#xFF0C;&#x8FD9;&#x4E5F;&#x8868;&#x660E;&#x4E86;&#x9ED8;&#x8BA4;&#x6784;&#x9020;&#x51FD;&#x6570;&#x4E0D;&#x80FD;&#x5206;&#x914D;&#x5185;&#x5B58;&#x7A7A;&#x95F4;&#x3002;</p>
<h3 id="&#x6307;&#x9488;&#x6784;&#x9020;&#x51FD;&#x6570;"><a href="#&#x6307;&#x9488;&#x6784;&#x9020;&#x51FD;&#x6570;" class="headerlink" title="&#x6307;&#x9488;&#x6784;&#x9020;&#x51FD;&#x6570;"></a>&#x6307;&#x9488;&#x6784;&#x9020;&#x51FD;&#x6570;</h3><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">template</span>&lt;<span class="keyword">class</span> Y&gt; <span class="function"><span class="keyword">explicit</span> <span class="title">shared_ptr</span><span class="params">(Y *p)</span></span>;</span><br></pre></td></tr></table></figure>
<blockquote>
<p>&#x524D;&#x7F6E;&#x6761;&#x4EF6;&#xFF1A;Y &#x5FC5;&#x987B;&#x662F;&#x5B8C;&#x6574;&#x7C7B;&#x578B;&#x3002;&#x5F53; T &#x662F;&#x6570;&#x7EC4;&#x7C7B;&#x578B;&#x65F6;&#xFF0C;&#x8BED;&#x53E5; delete[] p&#xFF1B;&#x5F53; T &#x975E;&#x6570;&#x7EC4;&#x7C7B;&#x578B;&#x65F6;&#xFF0C;delete p &#x5FC5;&#x987B;&#x53EF;&#x4EE5;&#x6267;&#x884C;&#xFF0C;&#x4E0D;&#x80FD;&#x629B;&#x51FA;&#x5F02;&#x5E38;&#x3002;&#x5F53; T &#x662F; U[N]&#xFF0C;Y(<em>)[N] &#x5FC5;&#x987B;&#x53EF;&#x4EE5;&#x8F6C;&#x5316;&#x5230; T&#xFF0A;&#xFF1B;&#x5F53; T &#x662F; U[]&#xFF0C;Y(</em>)[] &#x5FC5;&#x987B;&#x53EF;&#x4EE5;&#x8F6C;&#x5316;&#x5230; T&#xFF0A;&#xFF1B;&#x5426;&#x5219;&#xFF0C; Y&#xFF0A; &#x5FC5;&#x987B;&#x53EF;&#x4EE5;&#x8F6C;&#x5316;&#x5230; T&#xFF0A;&#x3002;<br>&#x6548;&#x679C;&#xFF1A;&#x5F53; T &#x975E;&#x6570;&#x7EC4;&#x7C7B;&#x578B;&#x65F6;&#xFF0C;&#x6784;&#x9020;&#x4E00;&#x4E2A;&#x62E5;&#x6709;&#x6307;&#x9488; p &#x7684;shared_ptr&#x3002;&#x5426;&#x5219;&#xFF0C;&#x521B;&#x5EFA;&#x4E00;&#x4E2A;&#x62E5;&#x6709;&#x6307;&#x9488; p &#x548C;&#x4E00;&#x4E2A;&#x53EF;&#x4EE5;&#x8C03;&#x7528; delete[] p &#x7684; deleter&#x3002;<br>&#x540E;&#x7F6E;&#x6761;&#x4EF6;&#xFF1A;use_count() == 1 &amp;&amp; get() == p&#x3002;&#x5982;&#x679C; T &#x975E;&#x6570;&#x7EC4;&#x7C7B;&#x578B;&#x5E76;&#x4E14; p &#x53EF;&#x4EE5;&#x8F6C;&#x5316;&#x5230; enable_shared_from_this&lt; V &gt;*&#xFF0C;p-&gt;shared_from_this()&#x8FD4;&#x56DE; &#xFF0A;this &#x7684;&#x4E00;&#x4E2A;&#x62F7;&#x8D1D;&#x3002;<br>&#x629B;&#x51FA;&#xFF1A;&#x5F53;&#x8D44;&#x6E90;&#x4E0D;&#x80FD;&#x88AB;&#x6EE1;&#x8DB3;&#x65F6;&#xFF0C;std::bad_alloc &#x6216;&#x8005;&#x81EA;&#x5B9A;&#x4E49;&#x7684;&#x5F02;&#x5E38;&#x3002;<br>&#x5F02;&#x5E38;&#x5B89;&#x5168;&#xFF1A;&#x5982;&#x679C;&#x5F02;&#x5E38;&#x88AB;&#x629B;&#x51FA;&#xFF0C;T &#x662F;&#x6570;&#x7EC4;&#x7C7B;&#x578B;&#xFF0C;&#x6784;&#x9020;&#x51FD;&#x6570;&#x8C03;&#x7528; delete[] p&#xFF1B;T &#x975E;&#x6570;&#x7EC4;&#x7C7B;&#x578B;&#x5219;&#x8C03;&#x7528; delete p&#x3002;<br>&#x6CE8;&#x610F;&#xFF1A;p &#x5FC5;&#x987B;&#x662F;&#x6307;&#x5411;&#x901A;&#x8FC7; C++ &#x7684; new &#x8868;&#x8FBE;&#x5F0F;&#x6765;&#x521B;&#x5EFA;&#x7684;&#x5BF9;&#x8C61;&#x7684;&#x6307;&#x9488;&#xFF0C;&#x6216;&#x8005;&#x4E3A; 0&#x3002;&#x5373;&#x4F7F; p &#x4E3A; 0&#xFF0C; &#x540E;&#x7F6E;&#x6761;&#x4EF6;&#x4E2D; use_count() &#x4E5F;&#x4E3A; 1&#xFF1B;delete &#x4F5C;&#x7528;&#x4E8E;&#x503C;&#x4E3A; 0 &#x7684;&#x6307;&#x9488;&#x65E0;&#x5BB3;&#x3002;</p>
</blockquote>
<p>&#x8BE5;&#x6784;&#x9020;&#x51FD;&#x6570;&#x662F;&#x6A21;&#x7248;&#x51FD;&#x6570;&#xFF0C;&#x662F;&#x4E3A;&#x8BB0;&#x5FC6;&#x4F20;&#x8FDB;&#x6765;&#x7684;&#x6307;&#x9488;&#x7684;&#x771F;&#x5B9E;&#x7C7B;&#x578B;&#x3002;&#x6790;&#x6784;&#x51FD;&#x6570;&#x5C06;&#x4F1A;&#x8C03;&#x7528; delete &#x4F5C;&#x7528;&#x4E8E;&#x539F;&#x59CB;&#x7C7B;&#x578B;&#x7684;&#x6307;&#x9488;&#xFF0C;&#x5373;&#x4F7F;&#x5F53; T &#x6CA1;&#x6709;&#x4E00;&#x4E2A;&#x865A;&#x6790;&#x6784;&#x51FD;&#x6570;&#x6216;&#x8005;&#x4E3A; void&#x3002;</p>
<h3 id="&#x5E26;-deleter-&#x7684;&#x6784;&#x9020;&#x51FD;&#x6570;"><a href="#&#x5E26;-deleter-&#x7684;&#x6784;&#x9020;&#x51FD;&#x6570;" class="headerlink" title="&#x5E26; deleter &#x7684;&#x6784;&#x9020;&#x51FD;&#x6570;"></a>&#x5E26; deleter &#x7684;&#x6784;&#x9020;&#x51FD;&#x6570;</h3><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">template</span>&lt;<span class="keyword">class</span> Y, <span class="keyword">class</span> D&gt; <span class="built_in">shared_ptr</span>(Y * p, D d);</span><br><span class="line"><span class="keyword">template</span>&lt;<span class="keyword">class</span> Y, <span class="keyword">class</span> D, <span class="keyword">class</span> A&gt; <span class="built_in">shared_ptr</span>(Y * p, D d, A a);</span><br><span class="line"><span class="keyword">template</span>&lt;<span class="keyword">class</span> D&gt; <span class="built_in">shared_ptr</span>(<span class="built_in">std</span>::<span class="keyword">nullptr_t</span> p, D d);</span><br><span class="line"><span class="keyword">template</span>&lt;<span class="keyword">class</span> D, <span class="keyword">class</span> A&gt; <span class="built_in">shared_ptr</span>(<span class="built_in">std</span>::<span class="keyword">nullptr_t</span> p, D d, A a);</span><br></pre></td></tr></table></figure>
<h3 id="&#x62F7;&#x8D1D;&#x6784;&#x9020;&#x51FD;&#x6570;"><a href="#&#x62F7;&#x8D1D;&#x6784;&#x9020;&#x51FD;&#x6570;" class="headerlink" title="&#x62F7;&#x8D1D;&#x6784;&#x9020;&#x51FD;&#x6570;"></a>&#x62F7;&#x8D1D;&#x6784;&#x9020;&#x51FD;&#x6570;</h3><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">shared_ptr</span>(<span class="built_in">shared_ptr</span> <span class="keyword">const</span> &amp; r); <span class="comment">// never throws</span></span><br><span class="line"><span class="keyword">template</span>&lt;<span class="keyword">class</span> Y&gt; <span class="built_in">shared_ptr</span>(<span class="built_in">shared_ptr</span>&lt;Y&gt; <span class="keyword">const</span> &amp; r); <span class="comment">// never throws</span></span><br></pre></td></tr></table></figure>
<blockquote>
<p>&#x524D;&#x7F6E;&#x6761;&#x4EF6;&#xFF1A;Y&#xFF0A; &#x53EF;&#x4EE5;&#x8F6C;&#x5316;&#x5230; T&#xFF0A;&#x3002;<br>&#x6548;&#x679C;&#xFF1A;&#x5982;&#x679C; r &#x662F;&#x7A7A;&#x7684;&#xFF0C;&#x6784;&#x9020;&#x4E00;&#x4E2A;&#x7A7A;&#x7684;shared_ptr&#xFF1B;&#x5426;&#x5219;&#xFF0C;&#x6784;&#x9020;&#x4E00;&#x4E2A;&#x5206;&#x4EAB; r &#x7684;&#x6307;&#x9488;&#x6240;&#x6709;&#x6743;&#x7684;shared_ptr&#x3002;<br>&#x540E;&#x7F6E;&#x6761;&#x4EF6;&#xFF1A;get() == r.get() &amp;&amp; use_count() == r.use_count()&#x3002;<br>&#x629B;&#x51FA;&#xFF1A;&#x65E0;&#x3002;</p>
</blockquote>
<h3 id="Move-&#x6784;&#x9020;&#x51FD;&#x6570;"><a href="#Move-&#x6784;&#x9020;&#x51FD;&#x6570;" class="headerlink" title="Move &#x6784;&#x9020;&#x51FD;&#x6570;"></a>Move &#x6784;&#x9020;&#x51FD;&#x6570;</h3><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">shared_ptr</span>(<span class="built_in">shared_ptr</span> &amp;&amp; r); <span class="comment">// never throws</span></span><br><span class="line"><span class="keyword">template</span>&lt;<span class="keyword">class</span> Y&gt; <span class="built_in">shared_ptr</span>(<span class="built_in">shared_ptr</span>&lt;Y&gt; &amp;&amp; r); <span class="comment">// never throws</span></span><br></pre></td></tr></table></figure>
<blockquote>
<p>&#x524D;&#x7F6E;&#x6761;&#x4EF6;&#xFF1A;Y&#xFF0A; &#x53EF;&#x4EE5;&#x8F6C;&#x5316;&#x5230; T&#xFF0A;&#x3002;<br>&#x6548;&#x679C;&#xFF1A;move &#x6784;&#x9020;&#x4E00;&#x4E2A;&#x4ECE; r &#x7684; shared_ptr&#x3002;<br>&#x540E;&#x7F6E;&#x6761;&#x4EF6;&#xFF1A;&#xFF0A;this &#x5305;&#x542B;&#x4E86; r &#x65E7;&#x7684;&#x503C;&#x3002;r &#x4E3A;&#x7A7A;&#x5E76;&#x4E14; r.get() == 0&#x3002;<br>&#x629B;&#x51FA;&#xFF1A;&#x65E0;&#x3002;</p>
</blockquote>
<h3 id="aliasing-&#x6784;&#x9020;&#x51FD;&#x6570;"><a href="#aliasing-&#x6784;&#x9020;&#x51FD;&#x6570;" class="headerlink" title="aliasing &#x6784;&#x9020;&#x51FD;&#x6570;"></a>aliasing &#x6784;&#x9020;&#x51FD;&#x6570;</h3><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">template</span>&lt;<span class="keyword">class</span> Y&gt; <span class="built_in">shared_ptr</span>(<span class="built_in">shared_ptr</span>&lt;Y&gt; <span class="keyword">const</span> &amp; r, element_type * p); <span class="comment">// never throws</span></span><br></pre></td></tr></table></figure>
<h3 id="weak-ptr-&#x6784;&#x9020;&#x51FD;&#x6570;"><a href="#weak-ptr-&#x6784;&#x9020;&#x51FD;&#x6570;" class="headerlink" title="weak_ptr &#x6784;&#x9020;&#x51FD;&#x6570;"></a>weak_ptr &#x6784;&#x9020;&#x51FD;&#x6570;</h3><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">template</span>&lt;<span class="keyword">class</span> Y&gt; <span class="function"><span class="keyword">explicit</span> <span class="title">shared_ptr</span><span class="params">(weak_ptr&lt;Y&gt; <span class="keyword">const</span> &amp; r)</span></span>;</span><br></pre></td></tr></table></figure>
<blockquote>
<p>&#x524D;&#x7F6E;&#x6761;&#x4EF6;&#xFF1A;Y&#xFF0A; &#x53EF;&#x4EE5;&#x8F6C;&#x5316;&#x5230; T&#xFF0A;&#x3002;<br>&#x6548;&#x679C;&#xFF1A;&#x6784;&#x9020;&#x4E00;&#x4E2A;&#x5206;&#x4EAB; r &#x6240;&#x6709;&#x6743;&#x7684; shared_ptr &#x5E76;&#x4E14;&#x590D;&#x5236; r &#x4E2D;&#x7684;&#x6307;&#x9488;&#x3002;<br>&#x540E;&#x7F6E;&#x6761;&#x4EF6;&#xFF1A;use_count() == r.use_count()&#x3002;<br>&#x629B;&#x51FA;&#xFF1A;&#x5F53; r.use_count() == 0, bad_weak_ptr&#x3002;<br>&#x5F02;&#x5E38;&#x5B89;&#x5168;&#xFF1A;&#x5982;&#x679C;&#x5F02;&#x5E38;&#x629B;&#x51FA;&#xFF0C;&#x6784;&#x9020;&#x51FD;&#x6570;&#x5C06;&#x65E0;&#x6548;&#x679C;&#x3002;</p>
</blockquote>
<h3 id="auto-ptr-&#x6784;&#x9020;&#x51FD;&#x6570;"><a href="#auto-ptr-&#x6784;&#x9020;&#x51FD;&#x6570;" class="headerlink" title="auto_ptr &#x6784;&#x9020;&#x51FD;&#x6570;"></a>auto_ptr &#x6784;&#x9020;&#x51FD;&#x6570;</h3><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">template</span>&lt;<span class="keyword">class</span> Y&gt; <span class="built_in">shared_ptr</span>(<span class="built_in">std</span>::<span class="built_in">auto_ptr</span>&lt;Y&gt; &amp; r);</span><br><span class="line"><span class="keyword">template</span>&lt;<span class="keyword">class</span> Y&gt; <span class="built_in">shared_ptr</span>(<span class="built_in">std</span>::<span class="built_in">auto_ptr</span>&lt;Y&gt; &amp;&amp; r);</span><br></pre></td></tr></table></figure>
<blockquote>
<p>&#x524D;&#x7F6E;&#x6761;&#x4EF6;&#xFF1A;Y&#xFF0A; &#x53EF;&#x4EE5;&#x8F6C;&#x5316;&#x5230; T&#xFF0A;&#x3002;<br>&#x6548;&#x679C;&#xFF1A;&#x6784;&#x9020;&#x4E00;&#x4E2A; shared_ptr&#xFF0C;&#x5B58;&#x50A8; r.release() &#x7684;&#x62F7;&#x8D1D;<br>&#x540E;&#x7F6E;&#x6761;&#x4EF6;&#xFF1A;use_count() == 1&#x3002;<br>&#x629B;&#x51FA;&#xFF1A;&#x5F53;&#x8D44;&#x6E90;&#x4E0D;&#x80FD;&#x88AB;&#x6EE1;&#x8DB3;&#x65F6;&#xFF0C;std::bad_alloc &#x6216;&#x8005;&#x81EA;&#x5B9A;&#x4E49;&#x7684;&#x5F02;&#x5E38;&#x3002;<br>&#x5F02;&#x5E38;&#x5B89;&#x5168;&#xFF1A;&#x5982;&#x679C;&#x5F02;&#x5E38;&#x629B;&#x51FA;&#xFF0C;&#x6784;&#x9020;&#x51FD;&#x6570;&#x5C06;&#x65E0;&#x6548;&#x679C;&#x3002;</p>
</blockquote>
<h3 id="unique-ptr-&#x6784;&#x9020;&#x51FD;&#x6570;"><a href="#unique-ptr-&#x6784;&#x9020;&#x51FD;&#x6570;" class="headerlink" title="unique_ptr &#x6784;&#x9020;&#x51FD;&#x6570;"></a>unique_ptr &#x6784;&#x9020;&#x51FD;&#x6570;</h3><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">template</span>&lt;<span class="keyword">class</span> Y, <span class="keyword">class</span> D&gt; <span class="built_in">shared_ptr</span>(<span class="built_in">std</span>::<span class="built_in">unique_ptr</span>&lt;Y, D&gt; &amp;&amp; r);</span><br></pre></td></tr></table></figure>
<h3 id="&#x6790;&#x6784;&#x51FD;&#x6570;"><a href="#&#x6790;&#x6784;&#x51FD;&#x6570;" class="headerlink" title="&#x6790;&#x6784;&#x51FD;&#x6570;"></a>&#x6790;&#x6784;&#x51FD;&#x6570;</h3><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">~<span class="built_in">shared_ptr</span>(); <span class="comment">// never throws</span></span><br></pre></td></tr></table></figure>
<blockquote>
<p>&#x6548;&#x679C;&#xFF1A;<br> &#x5982;&#x679C; &#xFF0A;this &#x4E3A;&#x7A7A;&#xFF0C;&#x6216;&#x8005;&#x4E0E;&#x53E6;&#x5916;&#x4E00;&#x4E2A; shared_ptr &#x5171;&#x4EAB;&#x6240;&#x6709;&#x6743; (use_count()&gt;1)&#xFF0C;&#x90A3;&#x4E48;&#x6CA1;&#x6709;&#x526F;&#x4F5C;&#x7528;&#x3002;<br> &#x5426;&#x5219;&#xFF0C;&#x5982;&#x679C; &#xFF0A;this &#x62E5;&#x6709;&#x4E00;&#x4E2A;&#x6307;&#x9488; p &#x548C;&#x4E00;&#x4E2A; deleter d&#xFF0C;d(p) &#x88AB;&#x8C03;&#x7528;&#x3002;<br> &#x5426;&#x5219;&#xFF0C;&#xFF0A;this &#x62E5;&#x6709;&#x4E00;&#x4E2A;&#x6307;&#x9488; p&#xFF0C; delete p &#x88AB;&#x8C03;&#x7528;&#x3002;<br> &#x629B;&#x51FA;&#xFF1A; &#x65E0;&#x3002;</p>
</blockquote>
<h3 id="&#x8D4B;&#x503C;"><a href="#&#x8D4B;&#x503C;" class="headerlink" title="&#x8D4B;&#x503C;"></a>&#x8D4B;&#x503C;</h3><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">shared_ptr</span> &amp; <span class="keyword">operator</span>=(<span class="built_in">shared_ptr</span> <span class="keyword">const</span> &amp; r); <span class="comment">// never throws</span></span><br><span class="line"><span class="keyword">template</span>&lt;<span class="keyword">class</span> Y&gt; <span class="built_in">shared_ptr</span> &amp; <span class="keyword">operator</span>=(<span class="built_in">shared_ptr</span>&lt;Y&gt; <span class="keyword">const</span> &amp; r); <span class="comment">// never throws</span></span><br><span class="line"><span class="keyword">template</span>&lt;<span class="keyword">class</span> Y&gt; <span class="built_in">shared_ptr</span> &amp; <span class="keyword">operator</span>=(<span class="built_in">std</span>::<span class="built_in">auto_ptr</span>&lt;Y&gt; &amp; r);</span><br></pre></td></tr></table></figure>
<blockquote>
<p>&#x6548;&#x679C;&#xFF1A;&#x7B49;&#x540C;&#x4E8E; shared_ptr(r).swap(*this)&#x3002;<br>&#x8FD4;&#x56DE;&#xFF1A;&#xFF0A;this&#x3002;<br>&#x6CE8;&#x610F;&#xFF1A;&#x56E0;&#x4E3A;&#x4E34;&#x65F6;&#x5BF9;&#x8C61;&#x7684;&#x6784;&#x9020;&#x4F1A;&#x4F7F;&#x5F97; use_count() &#x66F4;&#x65B0;</p>
</blockquote>
<figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">shared_ptr</span> &amp; <span class="keyword">operator</span>=(<span class="built_in">shared_ptr</span> &amp;&amp; r); <span class="comment">// never throws</span></span><br><span class="line"><span class="keyword">template</span>&lt;<span class="keyword">class</span> Y&gt; <span class="built_in">shared_ptr</span> &amp; <span class="keyword">operator</span>=(<span class="built_in">shared_ptr</span>&lt;Y&gt; &amp;&amp; r); <span class="comment">// never throws</span></span><br><span class="line"><span class="keyword">template</span>&lt;<span class="keyword">class</span> Y&gt; <span class="built_in">shared_ptr</span> &amp; <span class="keyword">operator</span>=(<span class="built_in">std</span>::<span class="built_in">auto_ptr</span>&lt;Y&gt; &amp;&amp; r);</span><br><span class="line"><span class="keyword">template</span>&lt;<span class="keyword">class</span> Y, <span class="keyword">class</span> D&gt; <span class="built_in">shared_ptr</span> &amp; <span class="keyword">operator</span>=(<span class="built_in">std</span>::<span class="built_in">unique_ptr</span>&lt;Y, D&gt; &amp;&amp; r</span><br></pre></td></tr></table></figure>
<blockquote>
<p>&#x6548;&#x679C;&#xFF1A;&#x7B49;&#x540C;&#x4E8E; shared_ptr( std::move(r) ).swap(*this)&#x3002;<br>&#x8FD4;&#x56DE;&#xFF1A;&#xFF0A;this&#x3002;</p>
</blockquote>
<figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">shared_ptr</span> &amp; <span class="keyword">operator</span>=(<span class="built_in">std</span>::<span class="keyword">nullptr_t</span>); <span class="comment">// never throws</span></span><br></pre></td></tr></table></figure>
<blockquote>
<p>&#x6548;&#x679C;&#xFF1A;&#x7B49;&#x540C;&#x4E8E; shared_ptr().swap(*this)&#x3002;<br>&#x8FD4;&#x56DE;&#xFF1A;&#xFF0A;this&#x3002;</p>
</blockquote>
<h3 id="reset"><a href="#reset" class="headerlink" title="reset"></a>reset</h3><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">reset</span><span class="params">()</span></span>; <span class="comment">// never throws</span></span><br></pre></td></tr></table></figure>
<blockquote>
<p>&#x6548;&#x679C;&#xFF1A;&#x7B49;&#x540C;&#x4E8E; shared_ptr().swap(*this)&#x3002;</p>
</blockquote>
<figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">template</span>&lt;<span class="keyword">class</span> Y&gt; <span class="function"><span class="keyword">void</span> <span class="title">reset</span><span class="params">(Y * p)</span></span>;</span><br></pre></td></tr></table></figure>
<blockquote>
<p>&#x6548;&#x679C;&#xFF1A;&#x7B49;&#x540C;&#x4E8E; shared_ptr(p).swap(*this)&#x3002;</p>
</blockquote>
<figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">template</span>&lt;<span class="keyword">class</span> Y, <span class="keyword">class</span> D&gt; <span class="function"><span class="keyword">void</span> <span class="title">reset</span><span class="params">(Y * p, D d)</span></span>;</span><br></pre></td></tr></table></figure>
<blockquote>
<p>&#x6548;&#x679C;&#xFF1A;&#x7B49;&#x540C;&#x4E8E; shared_ptr(p&#xFF0C;d).swap(*this)&#x3002;</p>
</blockquote>
<figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">template</span>&lt;<span class="keyword">class</span> Y, <span class="keyword">class</span> D, <span class="keyword">class</span> A&gt; <span class="function"><span class="keyword">void</span> <span class="title">reset</span><span class="params">(Y * p, D d, A a)</span></span>;</span><br></pre></td></tr></table></figure>
<blockquote>
<p>&#x6548;&#x679C;&#xFF1A;&#x7B49;&#x540C;&#x4E8E; shared_ptr(p&#xFF0C;d&#xFF0C;s).swap(*this)&#x3002;</p>
</blockquote>
<figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">template</span>&lt;<span class="keyword">class</span> Y&gt; <span class="function"><span class="keyword">void</span> <span class="title">reset</span><span class="params">(<span class="built_in">shared_ptr</span>&lt;Y&gt; <span class="keyword">const</span> &amp; r, element_type * p)</span></span>; <span class="comment">// never throws</span></span><br></pre></td></tr></table></figure>
<blockquote>
<p>&#x6548;&#x679C;&#xFF1A;&#x7B49;&#x540C;&#x4E8E; shared_ptr(r,p).swap(*this)&#x3002;</p>
</blockquote>
<h3 id="indirection"><a href="#indirection" class="headerlink" title="indirection"></a>indirection</h3><h3 id="get"><a href="#get" class="headerlink" title="get"></a>get</h3><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="function">element_type * <span class="title">get</span><span class="params">()</span> <span class="keyword">const</span></span>; <span class="comment">// never throws</span></span><br></pre></td></tr></table></figure>
<blockquote>
<p>&#x8FD4;&#x56DE;&#xFF1A;&#x5B58;&#x50A8;&#x7684;&#x6307;&#x9488;&#x3002;<br>&#x629B;&#x51FA;&#xFF1A;&#x65E0;&#x3002;</p>
</blockquote>
<h3 id="unique"><a href="#unique" class="headerlink" title="unique"></a>unique</h3><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">bool</span> <span class="title">unique</span><span class="params">()</span> <span class="keyword">const</span></span>; <span class="comment">// never throws</span></span><br></pre></td></tr></table></figure>
<blockquote>
<p>&#x8FD4;&#x56DE;&#xFF1A;use_count() == 1&#x3002;<br>&#x629B;&#x51FA;&#xFF1A;&#x65E0;&#x3002;<br>&#x6CE8;&#x610F;&#xFF1A;unique() &#x6BD4; use_count() &#x66F4;&#x5FEB;&#x3002;&#x5982;&#x679C;&#x4F7F;&#x7528; unique() &#x6765;&#x5B9E;&#x73B0;&#x5199;&#x62F7;&#x8D1D;&#xFF0C;&#x5F53;&#x5B58;&#x50A8;&#x7684;&#x6307;&#x9488;&#x4E3A; 0 &#x65F6;&#x4E0D;&#x8981;&#x4F9D;&#x8D56;&#x7279;&#x5B9A;&#x7684;&#x503C;&#x3002;&#xFF08;&#xFF1F;&#xFF09;</p>
</blockquote>
<h3 id="use-count"><a href="#use-count" class="headerlink" title="use_count"></a>use_count</h3><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">long</span> <span class="title">use_count</span><span class="params">()</span> <span class="keyword">const</span></span>; <span class="comment">// never throws</span></span><br></pre></td></tr></table></figure>
<blockquote>
<p>&#x8FD4;&#x56DE;&#xFF1A;&#x5171;&#x4EAB;&#x6240;&#x6709;&#x6743;&#x7684; shared_ptr &#x7684;&#x6570;&#x91CF;&#xFF0C;&#x82E5; &#xFF0A;this &#x4E3A;&#x7A7A;&#x5219;&#x4E3A; 0&#x3002;<br>&#x629B;&#x51FA;&#xFF1A;&#x65E0;&#x3002;<br>&#x6CE8;&#x610F;&#xFF1A;use_count() &#x4E0D;&#x662F;&#x9AD8;&#x6548;&#x7684;&#xFF0C;&#x53EA;&#x662F;&#x7528;&#x6765;&#x8C03;&#x8BD5;&#x548C;&#x6D4B;&#x8BD5;&#x3002;</p>
</blockquote>
<h3 id="conversions"><a href="#conversions" class="headerlink" title="conversions"></a>conversions</h3><h3 id="swap"><a href="#swap" class="headerlink" title="swap"></a>swap</h3><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">swap</span><span class="params">(<span class="built_in">shared_ptr</span> &amp; b)</span></span>; <span class="comment">// never throws</span></span><br></pre></td></tr></table></figure>
<blockquote>
<p>&#x6548;&#x679C;&#xFF1A;&#x4EA4;&#x6362;&#x4E24;&#x4E2A;&#x667A;&#x80FD;&#x6307;&#x9488;&#x7684;&#x5185;&#x5BB9;<br>&#x629B;&#x51FA;&#xFF1A;&#x65E0;&#x3002;</p>
</blockquote>
<h2 id="Free-Functions"><a href="#Free-Functions" class="headerlink" title="Free Functions"></a>Free Functions</h2><h2 id="Example"><a href="#Example" class="headerlink" title="Example"></a>Example</h2><p><a href="http://www.boost.org/doc/libs/1_61_0/libs/smart_ptr/example/shared_ptr_example.cpp" target="_blank" rel="external">shared_ptr_example.cpp</a> &#x63D0;&#x4F9B;&#x4E86;&#x4E00;&#x4E2A;&#x5B8C;&#x6574;&#x7684;&#x4F8B;&#x5B50;&#xFF0C;&#x8BE5;&#x7A0B;&#x5E8F;&#x5305;&#x542B;&#x4E86; shared_ptr &#x5BF9;&#x8C61;&#x7684; std::vector &#x548C; std::set&#x3002;<br>&#x6CE8;&#x610F;&#x5BB9;&#x5668;&#x751F;&#x6210;&#x540E;&#xFF0C;shared_ptr &#x7684; use_count() &#x4E3A; 2.</p>
<figure class="highlight"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line">// Boost shared_ptr_example.cpp --------------------------------------------//</span><br><span class="line"></span><br><span class="line">// Copyright Beman Dawes 2001. Distributed under the Boost</span><br><span class="line">// Software License, Version 1.0. (See accompanying file</span><br><span class="line">// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">// See http://www.boost.org/libs/smart_ptr for documentation.</span><br><span class="line"></span><br><span class="line">// Revision History</span><br><span class="line">// 21 May 01 Initial complete version (Beman Dawes)</span><br><span class="line"></span><br><span class="line">// The original code for this example appeared in the shared_ptr documentation.</span><br><span class="line">// Ray Gallimore pointed out that foo_set was missing a Compare template</span><br><span class="line">// argument, so would not work as intended. At that point the code was</span><br><span class="line">// turned into an actual .cpp file so it could be compiled and tested.</span><br><span class="line"></span><br><span class="line">#include &lt;vector&gt;</span><br><span class="line">#include &lt;set&gt;</span><br><span class="line">#include &lt;iostream&gt;</span><br><span class="line">#include &lt;algorithm&gt;</span><br><span class="line">#include &lt;boost/shared_ptr.hpp&gt;</span><br><span class="line"></span><br><span class="line">// The application will produce a series of</span><br><span class="line">// objects of type Foo which later must be</span><br><span class="line">// accessed both by occurrence (std::vector)</span><br><span class="line">// and by ordering relationship (std::set).</span><br><span class="line"></span><br><span class="line">struct Foo</span><br><span class="line">{ </span><br><span class="line"> Foo( int _x ) : x(_x) {}</span><br><span class="line"> ~Foo() { std::cout &lt;&lt; &quot;Destructing a Foo with x=&quot; &lt;&lt; x &lt;&lt; &quot;\n&quot;; }</span><br><span class="line"> int x;</span><br><span class="line"> /* ... */</span><br><span class="line">};</span><br><span class="line"></span><br><span class="line">typedef boost::shared_ptr&lt;Foo&gt; FooPtr;</span><br><span class="line"></span><br><span class="line">struct FooPtrOps</span><br><span class="line">{</span><br><span class="line"> bool operator()( const FooPtr &amp; a, const FooPtr &amp; b )</span><br><span class="line"> { return a-&gt;x &gt; b-&gt;x; }</span><br><span class="line"> void operator()( const FooPtr &amp; a )</span><br><span class="line"> { std::cout &lt;&lt; a-&gt;x &lt;&lt; &quot; &quot; &lt;&lt; a.use_count() &lt;&lt; &quot;\n&quot;; }</span><br><span class="line">};</span><br><span class="line"></span><br><span class="line">int main()</span><br><span class="line">{</span><br><span class="line"> std::vector&lt;FooPtr&gt; foo_vector;</span><br><span class="line"> std::set&lt;FooPtr,FooPtrOps&gt; foo_set; // NOT multiset!</span><br><span class="line"></span><br><span class="line"> FooPtr foo_ptr( new Foo( 2 ) );</span><br><span class="line"> foo_vector.push_back( foo_ptr );</span><br><span class="line"> foo_set.insert( foo_ptr );</span><br><span class="line"></span><br><span class="line"> foo_ptr.reset( new Foo( 1 ) );</span><br><span class="line"> foo_vector.push_back( foo_ptr );</span><br><span class="line"> foo_set.insert( foo_ptr );</span><br><span class="line"></span><br><span class="line"> foo_ptr.reset( new Foo( 3 ) );</span><br><span class="line"> foo_vector.push_back( foo_ptr );</span><br><span class="line"> foo_set.insert( foo_ptr );</span><br><span class="line"></span><br><span class="line"> foo_ptr.reset ( new Foo( 2 ) );</span><br><span class="line"> foo_vector.push_back( foo_ptr );</span><br><span class="line"> foo_set.insert( foo_ptr );</span><br><span class="line"></span><br><span class="line"> std::cout &lt;&lt; &quot;foo_vector:\n&quot;;</span><br><span class="line"> std::for_each( foo_vector.begin(), foo_vector.end(), FooPtrOps() );</span><br><span class="line"> </span><br><span class="line"> std::cout &lt;&lt; &quot;\nfoo_set:\n&quot;; </span><br><span class="line"> std::for_each( foo_set.begin(), foo_set.end(), FooPtrOps() );</span><br><span class="line"> std::cout &lt;&lt; &quot;\n&quot;;</span><br><span class="line"></span><br><span class="line"> return 0;</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
<p>&#x7F16;&#x8BD1;&#x8FD0;&#x884C;</p>
<figure class="highlight stylus"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line">g++ -g shared_ptr_example<span class="selector-class">.cpp</span> -o shared_ptr_example</span><br><span class="line">./shared_ptr_example</span><br><span class="line"></span><br><span class="line">foo_vector:</span><br><span class="line"><span class="number">2</span> <span class="number">2</span></span><br><span class="line"><span class="number">1</span> <span class="number">2</span></span><br><span class="line"><span class="number">3</span> <span class="number">2</span></span><br><span class="line"><span class="number">2</span> <span class="number">2</span></span><br><span class="line"></span><br><span class="line">foo_set:</span><br><span class="line"><span class="number">3</span> <span class="number">2</span></span><br><span class="line"><span class="number">2</span> <span class="number">2</span></span><br><span class="line"><span class="number">1</span> <span class="number">2</span></span><br><span class="line"></span><br><span class="line">Destructing <span class="selector-tag">a</span> Foo with x=<span class="number">2</span></span><br><span class="line">Destructing <span class="selector-tag">a</span> Foo with x=<span class="number">3</span></span><br><span class="line">Destructing <span class="selector-tag">a</span> Foo with x=<span class="number">1</span></span><br><span class="line">Destructing <span class="selector-tag">a</span> Foo with x=<span class="number">2</span></span><br></pre></td></tr></table></figure>
<h2 id="Handle-Body-Idiom"><a href="#Handle-Body-Idiom" class="headerlink" title="Handle/Body Idiom"></a>Handle/Body Idiom</h2><p>shared_ptr &#x7684;&#x4E00;&#x4E2A;&#x5E38;&#x7528;&#x5730;&#x65B9;&#x662F;&#x5B9E;&#x73B0;&#x4E00;&#x4E2A; handle/body (pimpl) idiom, &#x5B83;&#x53EF;&#x4EE5;&#x907F;&#x514D;&#x5934;&#x6587;&#x4EF6;&#x4E2D;&#x7C7B;&#x7684;&#x5177;&#x4F53;&#x5B9E;&#x73B0;&#x3002;<br><a href="http://www.boost.org/doc/libs/1_61_0/libs/smart_ptr/example/shared_ptr_example2_test.cpp" target="_blank" rel="external">]shared_ptr_example2_test.cpp</a> &#x4F8B;&#x5B50;&#x5305;&#x542B;&#x4E86;&#x4E00;&#x4E2A;&#x5934;&#x6587;&#x4EF6; <a href="http://www.boost.org/doc/libs/1_61_0/libs/smart_ptr/example/shared_ptr_example2.hpp" target="_blank" rel="external">shared_ptr_example2.hpp</a>&#xFF0C;&#x8BE5;&#x5934;&#x6587;&#x4EF6;&#x5229;&#x7528; shared_ptr &#x53BB;&#x9690;&#x85CF;&#x4E86;&#x4E0D;&#x5B8C;&#x6574;&#x7C7B;&#x578B;&#x7684;&#x5177;&#x4F53;&#x5B9E;&#x73B0;&#x3002; <a href="http://www.boost.org/doc/libs/1_61_0/libs/smart_ptr/example/shared_ptr_example2.cpp" target="_blank" rel="external">shared_ptr_example2.cpp</a> &#x5219;&#x5305;&#x542B;&#x4E86;&#x5177;&#x4F53;&#x5B9E;&#x73B0;&#x3002;&#x6CE8;&#x610F;&#x8FD9;&#x91CC;&#x4E0D;&#x9700;&#x8981;&#x4E00;&#x4E2A; explicit &#x7684;&#x6790;&#x6784;&#x51FD;&#x6570;&#x3002;&#x4E0E; ~scoped_ptr &#x4E0D;&#x540C;&#xFF0C;~shared_ptr &#x4E0D;&#x9700;&#x8981; T &#x662F;&#x5B8C;&#x6574;&#x7C7B;&#x578B;&#x3002;(?)</p>
<figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// Boost shared_ptr_example2 header file -----------------------------------//</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// Copyright Beman Dawes 2001. Distributed under the Boost</span></span><br><span class="line"><span class="comment">// Software License, Version 1.0. (See accompanying file</span></span><br><span class="line"><span class="comment">// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">// See http://www.boost.org/libs/smart_ptr for documentation.</span></span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;boost/shared_ptr.hpp&gt;</span></span></span><br><span class="line"></span><br><span class="line"><span class="comment">// This example demonstrates the handle/body idiom (also called pimpl and</span></span><br><span class="line"><span class="comment">// several other names). It separates the interface (in this header file)</span></span><br><span class="line"><span class="comment">// from the implementation (in shared_ptr_example2.cpp).</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// Note that even though example::implementation is an incomplete type in</span></span><br><span class="line"><span class="comment">// some translation units using this header, shared_ptr&lt; implementation &gt;</span></span><br><span class="line"><span class="comment">// is still valid because the type is complete where it counts - in the</span></span><br><span class="line"><span class="comment">// shared_ptr_example2.cpp translation unit where functions requiring a</span></span><br><span class="line"><span class="comment">// complete type are actually instantiated.</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">class</span> example</span><br><span class="line">{</span><br><span class="line"><span class="keyword">public</span>:</span><br><span class="line"> example();</span><br><span class="line"> <span class="function"><span class="keyword">void</span> <span class="title">do_something</span><span class="params">()</span></span>;</span><br><span class="line"><span class="keyword">private</span>:</span><br><span class="line"> <span class="keyword">class</span> implementation;</span><br><span class="line"> boost::<span class="built_in">shared_ptr</span>&lt; implementation &gt; _imp; <span class="comment">// hide implementation details</span></span><br><span class="line">};</span><br></pre></td></tr></table></figure>
<figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// Boost shared_ptr_example2 implementation file -----------------------------//</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// Copyright Beman Dawes 2001. Distributed under the Boost</span></span><br><span class="line"><span class="comment">// Software License, Version 1.0. (See accompanying file</span></span><br><span class="line"><span class="comment">// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">// See http://www.boost.org/libs/smart_ptr for documentation.</span></span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="string">&quot;shared_ptr_example2.hpp&quot;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;iostream&gt;</span></span></span><br><span class="line"></span><br><span class="line"><span class="keyword">class</span> example::implementation</span><br><span class="line">{</span><br><span class="line"> <span class="keyword">public</span>:</span><br><span class="line"> ~implementation() { <span class="built_in">std</span>::<span class="built_in">cout</span> &lt;&lt; <span class="string">&quot;destroying implementation\n&quot;</span>; }</span><br><span class="line">};</span><br><span class="line"></span><br><span class="line">example::example() : _imp( <span class="keyword">new</span> implementation ) {}</span><br><span class="line"></span><br><span class="line"><span class="keyword">void</span> example::do_something()</span><br><span class="line"> { <span class="built_in">std</span>::<span class="built_in">cout</span> &lt;&lt; <span class="string">&quot;use_count() is &quot;</span> &lt;&lt; _imp.use_count() &lt;&lt; <span class="string">&quot;\n&quot;</span>; }</span><br></pre></td></tr></table></figure>
<figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// Boost shared_ptr_example2_test main program ------------------------------//</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// Copyright Beman Dawes 2001. Distributed under the Boost</span></span><br><span class="line"><span class="comment">// Software License, Version 1.0. (See accompanying file</span></span><br><span class="line"><span class="comment">// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">// See http://www.boost.org/libs/smart_ptr for documentation.</span></span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="string">&quot;shared_ptr_example2.hpp&quot;</span></span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span></span><br><span class="line"></span>{</span><br><span class="line"> example a;</span><br><span class="line"> a.do_something();</span><br><span class="line"> <span class="function">example <span class="title">b</span><span class="params">(a)</span></span>;</span><br><span class="line"> b.do_something();</span><br><span class="line"> example c;</span><br><span class="line"> c = a;</span><br><span class="line"> c.do_something();</span><br><span class="line"> <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
<p>&#x7F16;&#x8BD1;&#x8FD0;&#x884C;<br><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">g++ -g shared_ptr_example2.cpp shared_ptr_example2_test.cpp -o shared_ptr_example2_test</span><br><span class="line">./<span class="function">shared_ptr_example2_test</span><br><span class="line"></span><br><span class="line"><span class="title">use_count</span><span class="params">()</span> is 1</span><br><span class="line"><span class="title">use_count</span><span class="params">()</span> is 2</span><br><span class="line">destroying implementation</span><br><span class="line"><span class="title">use_count</span><span class="params">()</span> is 3</span><br><span class="line">destroying implementation</span></span><br></pre></td></tr></table></figure></p>
<p>&#x8FD9;&#x91CC;&#x7B2C;&#x4E00;&#x4E2A; destroying implementation &#x7684;&#x8F93;&#x51FA;&#x662F;&#x7531;&#x4E8E; c &#xFF1D; a &#x8BED;&#x53E5;&#x5BFC;&#x81F4; c &#x4E2D;&#x7684; _imp &#x88AB;&#x6790;&#x6784;&#x3002;</p>
<h2 id="Thread-Safety"><a href="#Thread-Safety" class="headerlink" title="Thread Safety"></a>Thread Safety</h2><p>shared_ptr &#x5BF9;&#x8C61;&#x63D0;&#x4F9B;&#x4E86; C++ &#x5185;&#x5EFA;&#x7C7B;&#x578B;&#x7684;&#x7EBF;&#x7A0B;&#x5B89;&#x5168;&#x7EA7;&#x522B;&#x3002; shared_ptr &#x5BF9;&#x8C61;&#x80FD;&#x88AB;&#x591A;&#x4E2A;&#x7EBF;&#x7A0B;&#x540C;&#x65F6;&#x8BFB;&#xFF0C;&#x4E0D;&#x540C;&#x7684; shared_ptr &#x5BF9;&#x8C61;&#x80FD;&#x591F;&#x88AB;&#x591A;&#x4E2A;&#x7EBF;&#x7A0B;&#x540C;&#x65F6;&#x5199;&#xFF08;&#x5373;&#x4F7F;&#x8FD9;&#x4E9B;&#x5BF9;&#x8C61;&#x662F;&#x5171;&#x4EAB;&#x540C;&#x4E00;&#x4E2A;&#x5F15;&#x7528;&#xFF09;&#x3002;</p>
<p>Example&#xFF1A;<br><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">shared_ptr</span>&lt;<span class="keyword">int</span>&gt; p(<span class="keyword">new</span> <span class="keyword">int</span>(<span class="number">42</span>));</span><br></pre></td></tr></table></figure></p>
<figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//--- Example 1 ---</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// thread A</span></span><br><span class="line"><span class="built_in">shared_ptr</span>&lt;<span class="keyword">int</span>&gt; p2(p); <span class="comment">// reads p</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// thread B</span></span><br><span class="line"><span class="built_in">shared_ptr</span>&lt;<span class="keyword">int</span>&gt; p3(p); <span class="comment">// OK, multiple reads are safe</span></span><br></pre></td></tr></table></figure>
<figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//--- Example 2 ---</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// thread A</span></span><br><span class="line">p.reset(<span class="keyword">new</span> <span class="keyword">int</span>(<span class="number">1912</span>)); <span class="comment">// writes p</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// thread B</span></span><br><span class="line">p2.reset(); <span class="comment">// OK, writes p2</span></span><br></pre></td></tr></table></figure>
<figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//--- Example 3 ---</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// thread A</span></span><br><span class="line">p = p3; <span class="comment">// reads p3, writes p</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// thread B</span></span><br><span class="line">p3.reset(); <span class="comment">// writes p3; undefined, simultaneous read/write</span></span><br></pre></td></tr></table></figure>
<figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//--- Example 4 ---</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// thread A</span></span><br><span class="line">p3 = p2; <span class="comment">// reads p2, writes p3</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// thread B</span></span><br><span class="line"><span class="comment">// p2 goes out of scope: undefined, the destructor is considered a &quot;write access&quot;</span></span><br></pre></td></tr></table></figure>
<figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//--- Example 5 ---</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// thread A</span></span><br><span class="line">p3.reset(<span class="keyword">new</span> <span class="keyword">int</span>(<span class="number">1</span>));</span><br><span class="line"></span><br><span class="line"><span class="comment">// thread B</span></span><br><span class="line">p3.reset(<span class="keyword">new</span> <span class="keyword">int</span>(<span class="number">2</span>)); <span class="comment">// undefined, multiple writes</span></span><br></pre></td></tr></table></figure>
<p>&#x4ECE; Boost release 1.33.0 &#x5F00;&#x59CB;&#xFF0C;shared_ptr &#x5728;&#x5927;&#x591A;&#x5E73;&#x53F0;&#x4E0A;&#x4F7F;&#x7528;&#x4E86;&#x901A;&#x7528;&#x9501;&#x7684;&#x5B9E;&#x73B0;&#x3002;<br>&#x5982;&#x679C;&#x4F60;&#x7684;&#x7A0B;&#x5E8F;&#x662F;&#x5355;&#x7EBF;&#x7A0B;&#x7684;&#xFF0C;&#x5E76;&#x4E14;&#x4E0D;&#x9700;&#x8981;&#x94FE;&#x63A5;&#x4F7F;&#x7528;&#x4E86; shared_ptr &#x7684;&#x5E93;&#xFF0C;&#x4F60;&#x53EF;&#x4EE5;&#x4F7F;&#x7528;&#x5B8F;&#x5B9A;&#x4E49; &#xFF03;define BOOST_SP_DISABLE_THREADS &#x6765;&#x5207;&#x6362;&#x5230;&#x666E;&#x901A;&#x975E;&#x539F;&#x5B50;&#x7684;&#x5F15;&#x7528;&#x8BA1;&#x6570;&#x66F4;&#x65B0;&#x3002;<br>&#x4F60;&#x80FD;&#x5B9A;&#x4E49;&#x5B8F; BOOST_SP_USE_PTHREADS &#x6765;&#x5173;&#x95ED;&#x901A;&#x7528;&#x9501;&#xFF0C;&#x5207;&#x6362;&#x56DE;&#x4F7F;&#x7528;&#x666E;&#x901A;&#x7684; pthread_mutex_t &#x7684;&#x4EE3;&#x7801;&#x3002;</p>
</content>
<summary type="html">
<blockquote>
<p>&#x6700;&#x8FD1;&#x5728;&#x770B;&#x9648;&#x7855;&#x7684;&#x300A;Linux&#x591A;&#x7EBF;&#x7A0B;&#x670D;&#x52A1;&#x7AEF;&#x7F16;&#x7A0B;&#xFF1A;&#x4F7F;&#x7528;muduo C++&#x7F51;&#x7EDC;&#x5E93;&#x300B;&#xFF0C;&#x7B2C;&#x4E00;&#x7AE0;&#x4E2D;&#x91CD;&#x70B9;&#x8BB2;&#x4E86;&#x591A;&#x7EBF;&#x7A0B;&#x4E0B;&#x6307;&#x9488;&#x7684;&#x5904;&#x7406;&#x95EE;&#x9898;&#xFF0C;&#x5176;&#x4E2D;&#x91CD;&#x70B9;&#x662F; shared_ptr &#x4E0E; weak_ptr, &#x4F46;&#x4E66;&#x4E2D;&#x5BF9;&#x8FD9;&#x90E8;&#x5206;&#x7684;&#x57FA;&#x7840;&#x4ECB;&#x7ECD;&#x6BD4;&#x8F83;&#x7B80;&#x7565;&#xFF0C;&#x4EE5;&#x524D;&#x770B;&#x8FC7;&#x667A;&#x80FD;&#x6307;&#x9488;&#xFF0C;&#x4F46;&#x4E00;&#x76F4;&#x6CA1;&#x6709;&#x5B8C;&#x6574;&#x5B66;&#x4E60;&#x8FC7;&#xFF0C;&#x56E0;&#x800C;&#x5B66;&#x4E60;&#x7FFB;&#x8BD1;&#x4E86;&#x5B98;&#x65B9;&#x7684;&#x6587;&#x6863;&#x8FDB;&#x884C;&#x5B66;&#x4E60;&#x3002;&#x4EE5;&#x4E0B;&#x662F; <a href="http://www.boost.org/doc/libs/1_61_0/libs/smart_ptr/shared_ptr.htm">boost::shared_ptr</a> &#x7684;&#x4E2D;&#x6587;&#x7FFB;&#x8BD1;&#xFF0C;&#x5176;&#x4E2D;&#x4E00;&#x90E8;&#x5206;&#x611F;&#x89C9;&#x4E0D;&#x662F;&#x5F88;&#x91CD;&#x8981;&#x7684;&#x8FD9;&#x91CC;&#x6682;&#x65F6;&#x6CA1;&#x6709;&#x7ED9;&#x51FA;&#x7FFB;&#x8BD1;&#x3002; </p>
</blockquote>
</summary>
<category term="Unix/Linux" scheme="http://deyituo.github.io/categories/Unix-Linux/"/>
<category term="shared_ptr" scheme="http://deyituo.github.io/tags/shared-ptr/"/>
<category term="C++" scheme="http://deyituo.github.io/tags/C/"/>
<category term="boost" scheme="http://deyituo.github.io/tags/boost/"/>
</entry>
<entry>
<title>人脸检测算法概述</title>
<link href="http://deyituo.github.io/2016/06/07/%E4%BA%BA%E8%84%B8%E6%A3%80%E6%B5%8B%E7%AE%97%E6%B3%95%E6%A6%82%E8%BF%B0/"/>
<id>http://deyituo.github.io/2016/06/07/人脸检测算法概述/</id>
<published>2016-06-07T12:31:29.000Z</published>
<updated>2016-06-11T09:23:04.000Z</updated>
<content type="html"><blockquote>
<p>&#x505A;&#x4EBA;&#x8138;&#x68C0;&#x6D4B;&#x5DF2;&#x7ECF;&#x4E00;&#x6BB5;&#x65F6;&#x95F4;&#x4E86;&#xFF0C;&#x4E34;&#x8FD1;&#x6BD5;&#x4E1A;&#x60F3;&#x60F3;&#x5DE5;&#x4F5C;&#x540E;&#x4F30;&#x8BA1;&#x5E94;&#x8BE5;&#x4E0D;&#x4F1A;&#x6709;&#x592A;&#x591A;&#x65F6;&#x95F4;&#x518D;&#x6765;&#x641E;&#x8FD9;&#x4E2A;&#xFF0C;&#x4E0B;&#x9762;&#x62BD;&#x53D6;&#x4E86;&#x6BD5;&#x4E1A;&#x8BBA;&#x6587;&#x7684;&#x7B2C;&#x4E8C;&#x7AE0;&#x5BF9;&#x4EE5;&#x524D;&#x770B;&#x8FC7;&#x7684;&#x8BBA;&#x6587;&#x8FDB;&#x884C;&#x4E86;&#x603B;&#x7ED3;&#xFF0C;&#x5199;&#x6210;&#x4E86;&#x4E0B;&#x9762;&#x7684;&#x7EFC;&#x8FF0;&#xFF0C;&#x6DB5;&#x76D6;&#x5230;&#x6BD4;&#x8F83;&#x591A;&#x7684;&#x65B9;&#x6CD5;&#xFF0C;&#x5E0C;&#x671B;&#x5BF9;&#x770B;&#x5230;&#x8FD9;&#x7BC7;&#x6587;&#x7AE0;&#x7684;&#x7814;&#x7A76;&#x8005;&#x4F1A;&#x6709;&#x6240;&#x5E2E;&#x52A9;&#x3002;</p>
</blockquote>
<a id="more"></a>
<p>&#x81EA; 2001 &#x5E74; Viola &#x548C; Jones <a href="#1">[1]</a> &#x5C06;&#x7EA7;&#x8054;&#x5206;&#x7C7B;&#x5668;&#x7684;&#x6982;&#x5FF5;&#x5F15;&#x5165;&#x5230;&#x4EBA;&#x8138;&#x68C0;&#x6D4B;&#x9886;&#x57DF;&#xFF0C; &#x5176;&#x540E;&#x53D1;&#x5C55;&#x8D77;&#x6765;&#x7684;&#x4EBA;&#x8138;&#x68C0;&#x6D4B;&#x7B97;&#x6CD5;&#x88AB;&#x8BBE;&#x8BA1;&#x6210;&#x66F4;&#x597D;&#x5730;&#x5904;&#x7406;&#x591A;&#x89D2;&#x5EA6;&#x68C0;&#x6D4B;&#xFF0C; &#x906E;&#x6321;&#xFF0C; &#x6A21;&#x7CCA;&#x7B49;&#x95EE;&#x9898; <a href="#15">[15]</a><a href="#16">[16]</a>&#x3002; &#x8FD9;&#x4E9B;&#x7B97;&#x6CD5;&#x4E3B;&#x8981;&#x6709;&#x4E09;&#x5927;&#x7C7B;&#x5206;&#x652F;&#xFF0C; &#x7B2C;&#x4E00;&#x7C7B;&#x662F;&#x57FA;&#x4E8E;&#x7EA7;&#x8054;&#x7ED3;&#x6784;&#x53CA;&#x5176;&#x6539;&#x8FDB;&#x7684;&#x7B97;&#x6CD5;&#xFF0C; &#x5982;&#x6587;&#x732E; <a href="#6">[6]</a><a href="#17">[17]</a><a href="#18">[18]</a> &#x4E2D;&#x6240;&#x63D0;&#x5230;&#x7684;&#x4EBA;&#x8138;&#x68C0;&#x6D4B;&#x65B9;&#x6CD5;&#x5728;&#x7279;&#x5F81;&#x8868;&#x8FBE;&#xFF0C; &#x5206;&#x7C7B;&#x5668;&#x6784;&#x9020;&#xFF0C; &#x8FD0;&#x884C;&#x901F;&#x7387;&#xFF0C; &#x591A;&#x89D2;&#x5EA6;&#x6A21;&#x677F;&#x5747;&#x8FDB;&#x884C;&#x4E86;&#x5927;&#x91CF;&#x7684;&#x6539;&#x8FDB;&#x3002;&#x7EA7;&#x8054;&#x5206;&#x7C7B;&#x4F7F;&#x5F97;&#x68C0;&#x6D4B;&#x65F6;&#x975E;&#x4EBA;&#x8138;&#x533A;&#x57DF;&#x53EF;&#x4EE5;&#x5FEB;&#x901F;&#x6392;&#x9664;&#xFF0C; &#x4ECE;&#x800C;&#x83B7;&#x5F97;&#x4E86;&#x9AD8;&#x6548;&#x7684;&#x8FD0;&#x884C;&#x901F;&#x7387;&#x3002; &#x8FD9;&#x7C7B;&#x4EBA;&#x8138;&#x68C0;&#x6D4B;&#x7CFB;&#x7EDF;&#x5DF2;&#x7ECF;&#x88AB;&#x5E7F;&#x6CDB;&#x5730;&#x8FD0;&#x7528;&#x4E8E;&#x94F6;&#x884C;&#xFF0C; &#x6444;&#x50CF;&#x5934;&#x76D1;&#x63A7;&#x7CFB;&#x7EDF;&#xFF0C; &#x79FB;&#x52A8;&#x624B;&#x673A;&#xFF0C; &#x7F51;&#x7EDC;&#x793E;&#x533A;&#x7B49;&#x3002;&#x7B2C;&#x4E8C;&#x7C7B;&#x662F;&#x57FA;&#x4E8E;&#x5F39;&#x6027;&#x4E0D;&#x53D8;&#x6A21;&#x578B; (DPM) <a href="#8">[8]</a> &#x7684;&#x7B97;&#x6CD5;&#xFF0C; &#x8FD9;&#x7C7B;&#x7B97;&#x6CD5;&#x7684;&#x6A21;&#x578B;&#x5305;&#x542B;&#x82E5;&#x5E72;&#x7EC4;&#x6210;&#x90E8;&#x5206;&#xFF0C; &#x800C;&#x8FD9;&#x4E9B;&#x7EC4;&#x6210;&#x90E8;&#x5206;&#x901A;&#x8FC7;&#x4F4D;&#x7F6E;&#x5173;&#x7CFB;&#x8FDB;&#x884C;&#x7EA6;&#x675F;&#x5F97;&#x5230;&#x6574;&#x4F53;&#x4EBA;&#x8138;&#x7684;&#x68C0;&#x6D4B;&#x6A21;&#x578B;&#xFF0C; &#x8FD9;&#x7C7B;&#x6A21;&#x578B;&#x5BF9;&#x4EBA;&#x8138;&#x7684;&#x5F62;&#x53D8;&#x53CA;&#x906E;&#x6321;&#x5177;&#x6709;&#x5F88;&#x597D;&#x7684;&#x9002;&#x5E94;&#x6027;&#x548C;&#x5F88;&#x9AD8;&#x7684;&#x7075;&#x6D3B;&#x6027;&#x3002; &#x6587;&#x732E; <a href="#9">[9]</a>&#x5728;&#x5F97;&#x5230;&#x7EC4;&#x6210;&#x90E8;&#x5206;&#x7684;&#x540C;&#x65F6;&#x8FDB;&#x884C;&#x4E86;&#x4EBA;&#x8138;&#x6807;&#x5B9A;&#x70B9;&#xFF0C; &#x4EBA;&#x8138;&#x89D2;&#x5EA6;&#x7684;&#x68C0;&#x6D4B;&#x3002; &#x7B2C;&#x4E09;&#x7C7B;&#x662F;&#x57FA;&#x4E8E;&#x795E;&#x7ECF;&#x7F51;&#x7EDC;&#x7684;&#x4EBA;&#x8138;&#x68C0;&#x6D4B;&#x7B97;&#x6CD5;&#xFF0C; &#x795E;&#x7ECF;&#x7F51;&#x7EDC;&#x4E3B;&#x8981;&#x7531;&#x82E5;&#x5E72;&#x5C42;&#x5377;&#x79EF;&#x5C42;&#xFF0C; Pooling &#x5C42;&#xFF0C; &#x5168;&#x8FDE;&#x63A5;&#x5C42;&#x7EC4;&#x6210;&#xFF0C; &#x5BF9;&#x56FE;&#x50CF;&#x63D0;&#x53D6;&#x7684;&#x5377;&#x79EF;&#x7F51;&#x7EDC;&#x7279;&#x5F81;&#x5BF9;&#x4EBA;&#x8138;&#x6709;&#x66F4;&#x9AD8;&#x5C42;&#x6B21;&#x7684;&#x8868;&#x8FBE;&#x6027;&#x3002; &#x6587;&#x732E; <a href="#19">[19]</a> &#x901A;&#x8FC7;&#x8BAD;&#x7EC3;&#x591A;&#x4E2A;&#x795E;&#x7ECF;&#x7F51;&#x7EDC;&#x6A21;&#x578B;&#x6765;&#x63D0;&#x9AD8;&#x4EBA;&#x8138;&#x68C0;&#x6D4B;&#x6548;&#x679C;&#x3002; &#x7531;&#x4E8E;&#x5C40;&#x90E8;&#x6700;&#x4F18;&#x95EE;&#x9898; <a href="#20">[20]</a> &#x53CA;&#x8BAD;&#x7EC3;&#x56F0;&#x96BE;&#xFF0C; &#x8FC7;&#x53BB;&#x7814;&#x7A76;&#x8005;&#x4EEC;&#x66F4;&#x591A;&#x5730;&#x8FDB;&#x884C;&#x524D;&#x4E24;&#x7C7B;&#x7B97;&#x6CD5;&#x7684;&#x7814;&#x7A76;&#x3002; &#x968F;&#x7740;&#x8FD1;&#x5E74;&#x6765;&#x6DF1;&#x5EA6;&#x5377;&#x79EF;&#x7F51;&#x7EDC;&#x7684;&#x6210;&#x529F;&#xFF0C; &#x795E;&#x7ECF;&#x7F51;&#x7EDC;&#x7B97;&#x6CD5;&#x91CD;&#x65B0;&#x88AB;&#x7814;&#x7A76;&#x8005;&#x4EEC;&#x6240;&#x91CD;&#x89C6;&#x3002;</p>
<p>&#x672C;&#x6587;&#x9996;&#x5148;&#x8BE6;&#x7EC6;&#x4ECB;&#x7ECD;&#x4E86;&#x57FA;&#x4E8E;&#x7EA7;&#x8054;&#x5206;&#x7C7B;&#x5668;&#x548C;&#x5F39;&#x6027;&#x4E0D;&#x53D8;&#x6A21;&#x578B;&#x7684;&#x4EBA;&#x8138;&#x68C0;&#x6D4B;&#x7B97;&#x6CD5;&#xFF0C; &#x4EE5;&#x53CA;&#x5F53;&#x524D;&#x7814;&#x7A76;&#x4E2D;&#x5BF9;&#x8FD9;&#x4E9B;&#x7B97;&#x6CD5;&#x8FDB;&#x884C;&#x7684;&#x6539;&#x8FDB;&#x3002; &#x63A5;&#x7740;&#xFF0C; &#x7B80;&#x5355;&#x9610;&#x8FF0;&#x4E86;&#x795E;&#x7ECF;&#x7F51;&#x7EDC;&#x53CA;&#x6DF1;&#x5EA6;&#x5B66;&#x4E60;&#x7684;&#x5386;&#x53F2;&#xFF0C; &#x7136;&#x540E;&#x8BE6;&#x7EC6;&#x4ECB;&#x7ECD;&#x4E86;&#x57FA;&#x4E8E;&#x795E;&#x7ECF;&#x7F51;&#x7EDC;&#x7684;&#x4EBA;&#x8138;&#x68C0;&#x6D4B;&#x7B97;&#x6CD5;&#x4EE5;&#x53CA;&#x8FD1;&#x6765;&#x7684;&#x53D1;&#x5C55;&#x3002; &#x6700;&#x540E;&#xFF0C;&#x672C;&#x6587;&#x5C0F;&#x7ED3;&#x4E86;&#x8FD9;&#x4E09;&#x7C7B;&#x65B9;&#x6CD5;&#x7684;&#x5F02;&#x540C;&#x3002;</p>
<h2 id="&#x57FA;&#x4E8E;&#x7EA7;&#x8054;&#x5206;&#x7C7B;&#x5668;&#x7684;&#x4EBA;&#x8138;&#x68C0;&#x6D4B;&#x7B97;&#x6CD5;"><a href="#&#x57FA;&#x4E8E;&#x7EA7;&#x8054;&#x5206;&#x7C7B;&#x5668;&#x7684;&#x4EBA;&#x8138;&#x68C0;&#x6D4B;&#x7B97;&#x6CD5;" class="headerlink" title="&#x57FA;&#x4E8E;&#x7EA7;&#x8054;&#x5206;&#x7C7B;&#x5668;&#x7684;&#x4EBA;&#x8138;&#x68C0;&#x6D4B;&#x7B97;&#x6CD5;"></a>&#x57FA;&#x4E8E;&#x7EA7;&#x8054;&#x5206;&#x7C7B;&#x5668;&#x7684;&#x4EBA;&#x8138;&#x68C0;&#x6D4B;&#x7B97;&#x6CD5;</h2><p>&#x57FA;&#x4E8E;&#x7EA7;&#x8054;&#x5206;&#x7C7B;&#x5668;&#x7684;&#x4EBA;&#x8138;&#x68C0;&#x6D4B;&#x7B97;&#x6CD5;&#x6269;&#x5C55;&#x4E86; Viola &#x548C; Jones <a href="#1">[1]</a> &#x6700;&#x521D;&#x63D0;&#x51FA;&#x7684;&#x7EA7;&#x8054;&#x7ED3;&#x6784; (cascade structure)&#xFF0C; &#x5176;&#x6838;&#x5FC3;&#x601D;&#x60F3;&#x5C31;&#x662F;&#xFF0C; &#x8BA9;&#x8D1F;&#x6837;&#x672C;&#x901A;&#x8FC7;&#x6240;&#x6709;&#x5F31;&#x5206;&#x7C7B;&#x5668; (weak classifiers) &#x7684;&#x6982;&#x7387;&#x5C3D;&#x53EF;&#x80FD;&#x4F4E;&#xFF0C;&#x540C;&#x65F6;&#x4FDD;&#x8BC1;&#x6B63;&#x6837;&#x672C;&#x901A;&#x8FC7;&#x6BCF;&#x5C42;&#x7531;&#x5F31;&#x5206;&#x7C7B;&#x7EC4;&#x6210;&#x7684;&#x5F3A;&#x5206;&#x7C7B;&#x5668;&#xFF08;strong classifier&#xFF09;&#x7684;&#x6700;&#x4F4E;&#x6982;&#x7387;&#xFF0C; &#x8FBE;&#x5230;&#x9AD8;&#x68C0;&#x6D4B;&#x7387;&#x4F4E;&#x9519;&#x68C0;&#x7387;&#x7684;&#x76EE;&#x7684;&#x3002; &#x5728;&#x56FE; 2-1 &#x4E2D;&#xFF0C; &#x4EE5;&#x51B3;&#x7B56;&#x6811; (CART) &#x4F5C;&#x4E3A;&#x5F31;&#x5206;&#x7C7B;&#x5668;&#x4E3A;&#x4F8B;&#xFF0C; &#x56FE;2-1&#xFF08;a&#xFF09;&#x8868;&#x793A;&#x8F93;&#x5165;&#x7684;&#x56FE;&#x50CF;&#xFF0C; &#x56FE;2-1&#xFF08;b-g&#xFF09;&#x7EFF;&#x8272;&#x77E9;&#x5F62;&#x8868;&#x793A;&#x7ECF;&#x8FC7;&#x82E5;&#x5E72;&#x5C42;&#x540E;&#x5269;&#x4E0B;&#x7684;&#x5019;&#x9009;&#x76EE;&#x6807;&#x533A;&#x57DF;&#xFF0C; &#x53EF;&#x4EE5;&#x770B;&#x51FA;&#xFF0C; &#x7ECF;&#x8FC7; $ 20 $ &#x5C42;&#x540E;&#x5269;&#x4E0B;&#x7684;&#x5019;&#x9009;&#x76EE;&#x6807;&#x533A;&#x57DF;&#x96C6;&#x4E2D;&#x8986;&#x76D6;&#x5728;&#x4EBA;&#x8138;&#x6240;&#x5728;&#x7684;&#x533A;&#x57DF;&#xFF0C;&#x8FD9;&#x4E9B;&#x533A;&#x57DF;&#x7136;&#x540E;&#x7EE7;&#x7EED;&#x88AB;&#x9001;&#x5230;&#x540E;&#x7EED;&#x7684;&#x5206;&#x7C7B;&#x5668;&#x3002; &#x56FE;2-1&#xFF08;h&#xFF09;&#x8868;&#x793A;&#x7ECF;&#x8FC7;&#x6240;&#x6709;&#x5C42;&#x540E;&#x6700;&#x7EC8;&#x7684;&#x4EBA;&#x8138;&#x68C0;&#x6D4B;&#x7ED3;&#x679C;&#xFF0C; &#x53EF;&#x4EE5;&#x89C2;&#x5BDF;&#x5230;&#x4EBA;&#x8138;&#x533A;&#x57DF;&#x53EF;&#x4EE5;&#x987A;&#x5229;&#x901A;&#x8FC7;&#x8FD9;&#x4E9B;&#x5F31;&#x5206;&#x7C7B;&#x5668;&#xFF0C; &#x800C;&#x8D1F;&#x6837;&#x672C;&#x5219;&#x88AB;&#x57FA;&#x672C;&#x8FC7;&#x6EE4;&#x4E86;&#x3002; </p>
<center><img src="/2016/06/07/&#x4EBA;&#x8138;&#x68C0;&#x6D4B;&#x7B97;&#x6CD5;&#x6982;&#x8FF0;/1.png" alt="&#x56FE;2-1 &#x5728;lena&#x56FE;&#x4E0A;&#x4F7F;&#x7528;NPDFace&#x4EBA;&#x8138;&#x68C0;&#x6D4B;&#x5668; [[21]](#21) &#x8FDB;&#x884C;&#x4EBA;&#x8138;&#x68C0;&#x6D4B;&#x3002; &#x7EFF;&#x8272;&#x77E9;&#x5F62;&#x4E3A;&#x7ECF;&#x8FC7;&#x4E0D;&#x540C;&#x5C42;&#x6570;&#x6240;&#x5269;&#x4E0B;&#x7684;&#x5019;&#x9009;&#x4EBA;&#x8138;&#x533A;&#x57DF; "> &#x56FE;2-1 &#x5728;lena&#x56FE;&#x4E0A;&#x4F7F;&#x7528;NPDFace&#x4EBA;&#x8138;&#x68C0;&#x6D4B;&#x5668; <a href="#21">[21]</a> &#x8FDB;&#x884C;&#x4EBA;&#x8138;&#x68C0;&#x6D4B;&#x3002; &#x7EFF;&#x8272;&#x77E9;&#x5F62;&#x4E3A;&#x7ECF;&#x8FC7;&#x4E0D;&#x540C;&#x5C42;&#x6570;&#x6240;&#x5269;&#x4E0B;&#x7684;&#x5019;&#x9009;&#x4EBA;&#x8138;&#x533A;&#x57DF;<br><br></center>
<p>Viola &#x548C; Jones &#x6210;&#x529F;&#x5C06; AdaBoost &#x673A;&#x5668;&#x5B66;&#x4E60;&#x65B9;&#x6CD5; <a href="#22">[22]</a> &#x5F15;&#x5165;&#x5230;&#x4EBA;&#x8138;&#x68C0;&#x6D4B;&#x4E2D;&#xFF0C; &#x5728;&#x6587;&#x732E; <a href="#1">[1]</a><a href="#2">[2]</a> &#x4E2D;&#x91C7;&#x7528; Haar &#x7279;&#x5F81;&#x8FDB;&#x884C;&#x4EBA;&#x8138;&#x7279;&#x5F81;&#x8868;&#x8FBE;&#xFF0C; &#x7279;&#x5F81;&#x8868;&#x8FBE;&#x7B80;&#x5355;&#xFF0C; &#x5982;&#x56FE; 2-2(a)&#x3002; &#x63D0;&#x51FA;&#x7684;&#x79EF;&#x5206;&#x56FE;&#x6982;&#x5FF5;&#xFF0C; &#x8FDB;&#x4E00;&#x6B65;&#x52A0;&#x5FEB;&#x4E86;&#x7279;&#x5F81;&#x63D0;&#x53D6;&#x6548;&#x7387;&#xFF0C; &#x7136;&#x540E;&#x901A;&#x8FC7; $ 20 $ &#x5C42; AdaBoost &#x5206;&#x7C7B;&#x5668;&#x5FEB;&#x901F;&#x8FC7;&#x6EE4;&#x6389;&#x975E;&#x4EBA;&#x8138;&#x533A;&#x57DF;&#x3002; &#x7ECF;&#x5178;&#x7684;&#x7EA7;&#x8054; AdaBoost &#x7B97;&#x6CD5;&#x91C7;&#x7528;&#x5355;&#x5C42;&#x51B3;&#x7B56;&#x6811;&#xFF08;stump&#xFF09;&#x4F5C;&#x4E3A;&#x5F31;&#x5206;&#x7C7B;&#x5668;&#x3002; &#x8BAD;&#x7EC3;&#x65F6;&#xFF0C; &#x5F31;&#x5206;&#x7C7B;&#x5668;&#x7684;&#x52A0;&#x6743;&#x9519;&#x8BEF;&#x4E3A;&#xFF1A;</p>
<p>$$ \epsilon_i = min \sum_j w_j|h(x_i)-y_i| $$</p>
<p>&#x5176;&#x4E2D;&#xFF0C; $ \epsilon_i $ &#x4E3A;&#x7B2C;&#x4E2A;&#x5F31;&#x5206;&#x7C7B;&#x5668;&#x7684;&#x5206;&#x7C7B;&#x9519;&#x8BEF;&#xFF0C; $ w_j $ &#x4E3A;&#x8BAD;&#x7EC3;&#x6837;&#x672C;&#x7684;&#x6743;&#x91CD;&#xFF0C;$ y_i \in [1,0] $ &#x8868;&#x793A;&#x6837;&#x672C;&#x4E3A;&#x4EBA;&#x8138;&#x4E0E;&#x975E;&#x4EBA;&#x8138;&#xFF0C; $ h(x_i) $ &#x4E3A;&#x5F53;&#x524D;&#x5F31;&#x5206;&#x7C7B;&#x5668;&#x5BF9;&#x6837;&#x672C; $ x_i $ &#x7684;&#x8F93;&#x51FA;&#x5F97;&#x5206;&#x3002; &#x6BCF;&#x6B21;&#x8BAD;&#x7EC3;&#x5F97;&#x5230;&#x4E00;&#x4E2A;&#x5F31;&#x5206;&#x7C7B;&#x5668;&#x90FD;&#x4F1A;&#x5BF9;&#x8BAD;&#x7EC3;&#x6837;&#x672C;&#x7684;&#x6743;&#x91CD;&#x91CD;&#x65B0;&#x8FDB;&#x884C;&#x8C03;&#x6574;&#xFF0C; &#x964D;&#x4F4E;&#x5206;&#x7C7B;&#x6B63;&#x786E;&#x7684;&#x6837;&#x672C;&#x7684;&#x6743;&#x91CD;&#xFF0C; &#x5206;&#x7C7B;&#x9519;&#x8BEF;&#x7684;&#x6837;&#x672C;&#x5219;&#x4E0E;&#x4E4B;&#x76F8;&#x53CD;&#xFF0C; &#x4ECE;&#x800C;&#x4F7F;&#x5F97;&#x540E;&#x7EED;&#x7684;&#x5F31;&#x5206;&#x7C7B;&#x5668;&#x9488;&#x5BF9;&#x5206;&#x7C7B;&#x9519;&#x8BEF;&#x7684;&#x6837;&#x672C;&#x3002;</p>
<p>&#x68C0;&#x6D4B;&#x65F6;&#xFF0C; &#x7A97;&#x53E3; $ x $ &#x7ECF;&#x8FC7;&#x7531;&#x82E5;&#x5E72;&#x4E2A;&#x5F31;&#x5206;&#x7C7B;&#x5668;&#x7EC4;&#x6210;&#x7684; AdaBoost &#x5F3A;&#x5206;&#x7C7B;&#x5668;&#x8F93;&#x51FA;&#x4E3A;:</p>
<p>$$ C(x) = \begin{cases} 1, \sum_{i}^{T} \alpha_i h_i(x) \gt \eta \\ 0, otherwise \end{cases} , &#x5176;&#x4E2D; \alpha_i = log\frac{1-\epsilon_i}{\epsilon_i} $$</p>
<p>&#x5176;&#x4E2D; $ \eta $ &#x4E3A;&#x4FDD;&#x8BC1;&#x8D1F;&#x6837;&#x672C;&#x901A;&#x8FC7;&#x8BE5;&#x5F3A;&#x5206;&#x7C7B;&#x5668;&#x6982;&#x7387;&#x81F3;&#x591A;&#x4E3A; $ p_f $&#xFF0C; &#x6B63;&#x6837;&#x672C;&#x901A;&#x8FC7;&#x6982;&#x7387;&#x81F3;&#x5C11;&#x4E3A;&#x7684;&#x9608;&#x503C; $ p_t $(&#x5982; $ p_f = 0.5, p_t = 0.95 $)&#xFF0C; &#x7ECF;&#x8FC7; $ 20 $ &#x5C42;&#x540E;&#xFF0C; &#x6B63;&#x3001;&#x8D1F;&#x6837;&#x672C;&#x901A;&#x8FC7;&#x6240;&#x6709;&#x5C42;&#x7684;&#x6982;&#x7387;&#x5206;&#x522B;&#x4E3A; $ 0.95^{20} &gt; 0.9, 0.5^{20}&lt; 10^{-6} $&#x3002;</p>
<center><img src="/2016/06/07/&#x4EBA;&#x8138;&#x68C0;&#x6D4B;&#x7B97;&#x6CD5;&#x6982;&#x8FF0;/2.png" alt=" Haar &#x7279;&#x5F81;&#x793A;&#x4F8B; ">&#xFF08;a&#xFF09;Haar &#x7279;&#x5F81;&#x793A;&#x4F8B;&#x3002;&#x7070;&#x8272;&#x77E9;&#x5F62;&#x5185;&#x50CF;&#x7D20;&#x548C;&#x51CF;&#x53BB;&#x767D;&#x8272;&#x77E9;&#x5F62;&#x5185;&#x50CF;&#x7D20;&#x548C;&#x4E3A; Haar &#x7279;&#x5F81;&#x8BA1;&#x7B97;&#x65B9;&#x5F0F;&#xFF0C;&#x6587;&#x732E; <a href="#1">[1]</a><a href="#2">[2]</a> &#x91C7;&#x7528;&#x7070;&#x5EA6;&#x56FE;&#x8FDB;&#x884C;&#x8BA1;&#x7B97;<br><img src="/2016/06/07/&#x4EBA;&#x8138;&#x68C0;&#x6D4B;&#x7B97;&#x6CD5;&#x6982;&#x8FF0;/3.png" alt=" &#x591A;&#x901A;&#x9053;&#x7279;&#x5F81; ">&#xFF08;b&#xFF09;&#x591A;&#x901A;&#x9053;&#x7279;&#x5F81;&#xFF0C;&#x4ECE;&#x5DE6;&#x5230;&#x53F3;&#xFF0C;&#x4ECE;&#x4E0A;&#x5230;&#x4E0B;&#x4F9D;&#x6B21;&#x4E3A;LUV&#x5F69;&#x8272;&#x901A;&#x9053;&#xFF0C;&#x68AF;&#x5EA6;&#x54CD;&#x5E94;&#x56FE;&#x3001;&#x5728;&#x516D;&#x4E2A;&#x65B9;&#x5411;&#x4E0A;&#x7684;&#x68AF;&#x5EA6;&#x54CD;&#x5E94;&#x56FE;<br>&#x56FE;2-2 &#x4EBA;&#x8138;&#x7279;&#x5F81;<br><br></center>
<p>&#x7EA7;&#x8054; Adaboost &#x4EBA;&#x8138;&#x68C0;&#x6D4B;&#x7B97;&#x6CD5;&#x4EE5;&#x5176;&#x7B80;&#x5355;&#x7684;&#x7279;&#x5F81;&#xFF0C; &#x9AD8;&#x6548;&#x7684;&#x5B9E;&#x65F6;&#x6027;&#x800C;&#x5E7F;&#x53D7;&#x6B22;&#x8FCE;&#x3002; &#x4F46;&#x5176;&#x5BF9;&#x4EBA;&#x8138;&#x8FDB;&#x884C;&#x63CF;&#x8FF0;&#x7684; Haar &#x7279;&#x5F81;&#x5BF9;&#x4EBA;&#x8138;&#x7684;&#x89D2;&#x5EA6;&#x3001;&#x5149;&#x7167;&#x53D8;&#x5316;&#x3001;&#x6A21;&#x7CCA;&#x3001;&#x8868;&#x60C5;&#x53D8;&#x5316;&#x7B49;&#x590D;&#x6742;&#x60C5;&#x51B5;&#x9002;&#x5E94;&#x6027;&#x8F83;&#x5DEE;&#x3002; &#x6587;&#x732E; <a href="#4">[4]</a><a href="#5">[5]</a> &#x8FDB;&#x4E00;&#x6B65;&#x6269;&#x5C55;&#x4E86; Haar &#x7279;&#x5F81;&#x4EE5;&#x9002;&#x5E94;&#x66F4;&#x591A;&#x4E0D;&#x540C;&#x7684;&#x4EBA;&#x8138;&#x6A21;&#x5F0F;&#x3002; &#x9488;&#x5BF9; Haar &#x7279;&#x5F81;&#x8868;&#x8FBE;&#x6027;&#x5DEE;&#x7684;&#x95EE;&#x9898;&#xFF0C; &#x6587;&#x732E; <a href="#18">[18]</a><a href="#223">[23]</a> &#x63D0;&#x51FA;&#x4E86;&#x57FA;&#x4E8E;&#x66F4;&#x5F3A;&#x8868;&#x8FBE;&#x6027;&#x7684;SURF <a href="#25">[25]</a> &#x7279;&#x5F81;&#x7684;&#x4EBA;&#x8138;&#x7279;&#x5F81;&#xFF0C;&#x4F7F;&#x7528; CPU &#x5E76;&#x884C;&#x5904;&#x7406;&#x6280;&#x672F;&#x53CA;&#x79EF;&#x5206;&#x56FE;&#x52A0;&#x901F;&#x7279;&#x5F81;&#x8BA1;&#x7B97;&#x3002; &#x4EBA;&#x8138;&#x7279;&#x5F81;&#x4E2D;&#x7EB9;&#x7406;&#x7279;&#x5F81;&#x662F;&#x4E00;&#x79CD;&#x6BD4;&#x8F83;&#x91CD;&#x8981;&#x7684;&#x7279;&#x5F81;&#xFF0C; &#x6587;&#x732E; <a href="#26">[26]</a> &#x6307;&#x51FA;&#x7EB9;&#x7406;&#x5206;&#x5E03;&#x6BD4;&#x7EB9;&#x7406;&#x5F3A;&#x5EA6;&#x66F4;&#x6709;&#x5229;&#x4E8E;&#x5206;&#x7C7B;&#xFF0C; &#x6539;&#x8FDB;&#x4E86;&#x7EB9;&#x7406;&#x7279;&#x5F81; LBP <a href="#27">[27]</a> &#x6765;&#x8FDB;&#x884C;&#x4EBA;&#x8138;&#x8868;&#x8FBE;&#x3002; &#x4EBA;&#x8138;&#x68C0;&#x6D4B;&#x7B97;&#x6CD5;&#x5927;&#x591A;&#x6570;&#x4ECE;&#x7070;&#x5EA6;&#x56FE;&#x7279;&#x5F81;&#x63D0;&#x53D6;&#xFF0C; &#x5F69;&#x8272;&#x901A;&#x9053;&#x7531;&#x4E8E;&#x7279;&#x5F81;&#x63D0;&#x53D6;&#x56F0;&#x96BE;&#x800C;&#x88AB;&#x5FFD;&#x89C6;&#xFF0C; &#x800C;&#x4EBA;&#x8138;&#x8F6E;&#x5ED3;&#x7279;&#x5F81;&#x8868;&#x8FBE;&#x80FD;&#x529B;&#x5F3A;&#xFF0C; &#x6587;&#x732E; <a href="#28">[28]</a> &#x521B;&#x9020;&#x6027;&#x5730;&#x5F15;&#x5165;&#x4E86;&#x6587;&#x732E; <a href="#29">[29]</a> &#x4E2D;&#x9488;&#x5BF9;&#x884C;&#x4EBA;&#x68C0;&#x6D4B;&#x800C;&#x63D0;&#x51FA;&#x7684;&#x57FA;&#x4E8E; LUV &#x989C;&#x8272;&#x901A;&#x9053;&#x53CA; HOG &#x7279;&#x5F81; <a href="#30">[30]</a> &#x7684;&#x591A;&#x901A;&#x9053;&#x7279;&#x5F81;&#x5230;&#x4EBA;&#x8138;&#x68C0;&#x6D4B;&#x9886;&#x57DF;&#xFF0C; &#x8FD0;&#x7528;&#x79EF;&#x5206;&#x56FE;&#x52A0;&#x901F;&#x7279;&#x5F81;&#x8BA1;&#x7B97;&#xFF0C; &#x5982;&#x56FE; 2-2&#xFF08;b&#xFF09;&#x6240;&#x793A;&#x3002; &#x6587;&#x732E; <a href="#17">[17]</a> &#x5219;&#x4ECE;&#x6587;&#x732E; <a href="#31">[31]</a> &#x5F97;&#x5230;&#x7075;&#x611F;&#xFF0C;&#x53BB;&#x9664;&#x4E86;&#x6587;&#x732E; <a href="#28">[28]</a> &#x79EF;&#x5206;&#x56FE;&#x7684;&#x64CD;&#x4F5C;&#xFF0C; &#x5728;&#x7279;&#x5F81;&#x9009;&#x62E9;&#x65F6;&#x76F4;&#x63A5;&#x4ECE;&#x591A;&#x901A;&#x9053;&#x7279;&#x5F81;&#x56FE;&#x4E2D;&#x9009;&#x53D6;&#xFF0C; &#x8FDB;&#x4E00;&#x6B65;&#x7B80;&#x5316;&#x4E86;&#x7279;&#x5F81;&#x63D0;&#x53D6;&#x8FC7;&#x7A0B;&#xFF0C; &#x5E76;&#x53D6;&#x5F97;&#x4E0D;&#x9519;&#x7684;&#x6548;&#x679C;&#x3002;</p>
<p>&#x9664;&#x4E86;&#x5BF9;&#x7279;&#x5F81;&#x7684;&#x6539;&#x8FDB;&#xFF0C; &#x7EA7;&#x8054;&#x7ED3;&#x6784;&#x540C;&#x6837;&#x4E5F;&#x6210;&#x4E3A;&#x7814;&#x7A76;&#x8005;&#x4EEC;&#x5173;&#x6CE8;&#x7684;&#x91CD;&#x70B9;&#x3002; &#x6587;&#x732E; <a href="#5">[5]</a> &#x6307;&#x51FA; Gentle Adaboost &#x6BD4;&#x539F;&#x6765;&#x7684; Discrete Adaboost &#x7B97;&#x6CD5;&#x5206;&#x7C7B;&#x6548;&#x679C;&#x66F4;&#x597D;&#xFF0C; &#x6DF1;&#x5C42;&#x7684;&#x51B3;&#x7B56;&#x6811;&#x9700;&#x8981;&#x66F4;&#x5C11;&#x7684;&#x7EA7;&#x8054;&#x5C42;&#x6570;&#x3002; &#x8BAD;&#x7EC3;&#x65F6;&#x6B63;&#x6837;&#x672C;&#x8981;&#x5C3D;&#x53EF;&#x80FD;&#x5730;&#x53EF;&#x4EE5;&#x901A;&#x8FC7;&#x5F31;&#x5206;&#x7C7B;&#x5668;&#xFF0C; &#x56E0;&#x6B64;&#x5F31;&#x5206;&#x7C7B;&#x5668;&#x5BF9;&#x635F;&#x5931;&#x51FD;&#x6570;&#x7684;&#x5F71;&#x54CD;&#x6BD4;&#x8D1F;&#x6837;&#x672C;&#x8FDC;&#x8FDC;&#x8981;&#x5927;&#xFF0C; &#x6587;&#x732E; <a href="#32">[32]</a> &#x901A;&#x8FC7;&#x964D;&#x4F4E;&#x5F31;&#x5206;&#x7C7B;&#x5668;&#x5BF9;&#x6B63;&#x6837;&#x672C;&#x7684;&#x8F93;&#x51FA;&#x5F97;&#x5206;&#xFF0C; &#x4ECE;&#x800C;&#x4F7F;&#x5F97;&#x540E;&#x7EED;&#x7684;&#x5F31;&#x5206;&#x7C7B;&#x5668;&#x66F4;&#x597D;&#x5730;&#x9488;&#x5BF9;&#x6B63;&#x6837;&#x672C;&#x8FDB;&#x884C;&#x8BAD;&#x7EC3;&#x3002; &#x5728;&#x6587;&#x732E; <a href="#3">[3]</a> &#x4E2D;&#x5C06;&#x6BCF;&#x5C42;&#x5F3A;&#x5206;&#x7C7B;&#x5668;&#x5F97;&#x5206;&#x6539;&#x8FDB;&#x4E3A;&#x5F53;&#x524D;&#x5C42;&#x5F3A;&#x5206;&#x7C7B;&#x5668;&#x4E0E;&#x524D;&#x9762;&#x5F3A;&#x5206;&#x7C7B;&#x5668;&#x7684;&#x7D2F;&#x79EF;&#x548C;&#xFF0C; &#x5E76;&#x5C06;&#x5BF9;&#x5206;&#x7C7B;&#x6548;&#x679C;&#x65E0;&#x5F71;&#x54CD;&#x7684;&#x5DF2;&#x8BAD;&#x7EC3;&#x7684;&#x5F31;&#x5206;&#x7C7B;&#x5668;&#x8FDB;&#x884C;&#x4E86;&#x79FB;&#x9664;&#xFF0C; &#x9C81;&#x68D2;&#x6027;&#x66F4;&#x5F3A;&#x3002; &#x6587;&#x732E; <a href="#24">[24]</a> &#x8FDB;&#x4E00;&#x6B65;&#x5C06;&#x5F3A;&#x5206;&#x7C7B;&#x5668;&#x7B80;&#x5316;&#x4E3A;&#x5F31;&#x5206;&#x7C7B;&#x5668;&#xFF0C; &#x7ECF;&#x8FC7;&#x4E00;&#x4E2A;&#x5F31;&#x5206;&#x7C7B;&#x5668;&#x5219;&#x8FDB;&#x884C;&#x4E00;&#x6B21;&#x5224;&#x65AD;&#xFF0C; &#x6BCF;&#x4E2A;&#x5F31;&#x5206;&#x7C7B;&#x5668;&#x7684;&#x8F93;&#x51FA;&#x4E3A;&#x5F53;&#x524D;&#x5F31;&#x5206;&#x7C7B;&#x5668;&#x4E0E;&#x4E4B;&#x524D;&#x5F31;&#x5206;&#x7C7B;&#x5668;&#x7684;&#x7D2F;&#x52A0;&#x3002; &#x5355;&#x4E2A;&#x51B3;&#x7B56;&#x6811;&#x533A;&#x5206;&#x80FD;&#x529B;&#x8F83;&#x5F31;&#xFF0C; &#x6587;&#x732E; <a href="#18">[18]</a> &#x4F7F;&#x7528;&#x903B;&#x8F91;&#x56DE;&#x5F52;&#x5206;&#x7C7B;&#x5668;&#x4F5C;&#x4E3A;&#x6BCF;&#x5C42;&#x7684;&#x5F31;&#x5206;&#x7C7B;&#x5668;&#xFF0C; &#x9608;&#x503C;&#x4F9D;&#x636E;&#x66F2;&#x7EBF;&#x7684; AUC&#xFF08;area under curve&#xFF09; &#x5927;&#x5C0F;&#x6765;&#x8BBE;&#x7F6E;&#xFF0C; &#x589E;&#x5F3A;&#x4E86;&#x6B63;&#x6837;&#x672C;&#x901A;&#x8FC7;&#x7684;&#x6982;&#x7387;&#x540C;&#x65F6;&#x5927;&#x5927;&#x964D;&#x4F4E;&#x4E86;&#x8D1F;&#x6837;&#x672C;&#x901A;&#x8FC7;&#x7684;&#x6982;&#x7387;&#xFF0C; &#x51CF;&#x5C11;&#x4E86;&#x68C0;&#x6D4B;&#x7684;&#x9636;&#x6BB5;&#x6570;&#x76EE;&#x3002; &#x6587;&#x732E; <a href="#33">[33]</a> &#x901A;&#x8FC7;&#x63A8;&#x5BFC;&#x63D0;&#x51FA;&#x4E86;&#x7EA7;&#x8054;&#x7ED3;&#x6784;&#x7684;&#x4E24;&#x79CD;&#x4E00;&#x822C;&#x5316;&#x8868;&#x793A;&#x65B9;&#x5F0F;&#xFF0C; &#x9488;&#x5BF9;&#x5F31;&#x5206;&#x7C7B;&#x5668;&#x53E0;&#x52A0;&#x53EF;&#x80FD;&#x5BFC;&#x81F4;&#x7684;&#x5C40;&#x90E8;&#x6700;&#x4F18;&#x95EE;&#x9898;&#xFF0C; &#x63D0;&#x51FA;&#x4E86;&#x5728;&#x5F3A;&#x5206;&#x7C7B;&#x5668;&#x4E0A;&#x4EFB;&#x610F;&#x5C42;&#x52A8;&#x6001;&#x52A0;&#x5165;&#x6700;&#x4F18;&#x5F31;&#x5206;&#x7C7B;&#x5668;&#x7684;&#x7B97;&#x6CD5;&#xFF0C; &#x5C3D;&#x53EF;&#x80FD;&#x4FDD;&#x8BC1;&#x4E86;&#x5168;&#x5C40;&#x6700;&#x4F18;&#xFF0C; &#x51CF;&#x5C11;&#x4E86;&#x5F31;&#x5206;&#x7C7B;&#x5668;&#x6570;&#x76EE;&#x3002;</p>
<p>&#x7ED3;&#x5408;&#x5176;&#x4ED6;&#x9886;&#x57DF;&#x7684;&#x7B97;&#x6CD5;&#x4E3A;&#x57FA;&#x4E8E;&#x7EA7;&#x8054;&#x7ED3;&#x6784;&#x7684;&#x4EBA;&#x8138;&#x68C0;&#x6D4B;&#x7B97;&#x6CD5;&#x7684;&#x672A;&#x6765;&#x6539;&#x8FDB;&#x63D0;&#x4F9B;&#x4E86;&#x601D;&#x8DEF;&#x3002; &#x6587;&#x732E; <a href="#10">[10]</a><a href="#11">[11]</a> &#x7ED3;&#x5408;&#x6587;&#x672C;&#x68C0;&#x7D22;&#x6280;&#x672F;&#xFF0C; &#x5F31;&#x5206;&#x7C7B;&#x5668;&#x57FA;&#x4E8E;&#x4EBA;&#x8138;&#x8BCD;&#x888B; (face examplar)&#xFF0C; &#x6BCF;&#x4E00;&#x4E2A;&#x5F31;&#x5206;&#x7C7B;&#x5668;&#x8F93;&#x51FA;&#x56FE;&#x50CF;&#x7684;&#x4EBA;&#x8138;&#x54CD;&#x5E94;&#x56FE;&#xFF0C; &#x7D2F;&#x79EF;&#x8FD9;&#x4E9B;&#x54CD;&#x5E94;&#x56FE;&#x5F97;&#x5230;&#x6700;&#x540E;&#x7684;&#x4EBA;&#x8138;&#x68C0;&#x6D4B;&#x7ED3;&#x679C;&#x3002;&#x76F8;&#x90BB;&#x7A97;&#x53E3;&#x7684;&#x5F97;&#x5206;&#x6709;&#x4E00;&#x5B9A;&#x7684;&#x8054;&#x7CFB;&#x6027;&#xFF0C; &#x5355;&#x72EC;&#x5904;&#x7406;&#x6BCF;&#x4E2A;&#x7A97;&#x53E3;&#x53EF;&#x80FD;&#x5BFC;&#x81F4;&#x6B63;&#x6837;&#x672C;&#x8FC7;&#x65E9;&#x5730;&#x88AB;&#x53BB;&#x9664;&#xFF0C; &#x5728;&#x884C;&#x4EBA;&#x68C0;&#x6D4B;&#x9886;&#x57DF;&#xFF0C; &#x6587;&#x732E; <a href="#34">[34]</a> &#x5728;&#x4EFF;&#x7167;&#x4EBA;&#x7684;&#x795E;&#x7ECF;&#x9012;&#x8D28;&#x63D0;&#x51FA;&#x4E86;&#x5E26;&#x6709;&#x6FC0;&#x6D3B;&#x4E0E;&#x6291;&#x5236;&#x7ED3;&#x6784;&#x7684;&#x4EBA;&#x8138;&#x68C0;&#x6D4B;&#x7B97;&#x6CD5;&#xFF0C; &#x4F7F;&#x5F97;&#x9AD8;&#x5F97;&#x5206;&#x9644;&#x8FD1;&#x7684;&#x7A97;&#x53E3;&#x5F97;&#x5230;&#x589E;&#x5F3A;&#xFF0C; &#x800C;&#x4F4E;&#x5F97;&#x5206;&#x9644;&#x8FD1;&#x7684;&#x7A97;&#x53E3;&#x5F97;&#x5230;&#x6291;&#x5236;&#xFF0C; &#x8FDB;&#x4E00;&#x6B65;&#x63D0;&#x9AD8;&#x68C0;&#x6D4B;&#x7684;&#x53EC;&#x56DE;&#x7387;&#x548C;&#x51C6;&#x786E;&#x7387;&#xFF0C; &#x4E3A;&#x4EBA;&#x8138;&#x68C0;&#x6D4B;&#x7B97;&#x6CD5;&#x63D0;&#x4F9B;&#x4E86;&#x65B0;&#x601D;&#x8DEF;&#x3002; &#x975E;&#x7EA6;&#x675F;&#x573A;&#x666F;&#x4EBA;&#x8138;&#x5F62;&#x53D8;&#x8F83;&#x5927;&#xFF0C; &#x4EBA;&#x8138;&#x5BF9;&#x9F50;&#x65B9;&#x6CD5; <a href="#35">[35]</a>-<a href="#38">[38]</a> &#x53EF;&#x4EE5;&#x5BF9;&#x4EBA;&#x8138;&#x90E8;&#x4F4D;&#x8FDB;&#x884C;&#x5C40;&#x90E8;&#x62DF;&#x5408;&#x5F97;&#x5230;&#x4EBA;&#x8138;&#x7684;&#x7279;&#x5F81;&#x70B9;&#x4F4D;&#x7F6E;&#xFF0C; &#x6587;&#x732E; <a href="#39">[39]</a> &#x521B;&#x65B0;&#x6027;&#x5730;&#x5C06;&#x4EBA;&#x8138;&#x68C0;&#x6D4B;&#x4E0E;&#x5BF9;&#x9F50;&#x65B9;&#x6CD5;&#x8FDB;&#x884C;&#x7ED3;&#x5408;&#xFF0C; &#x5728;&#x5B66;&#x4E60;&#x6BCF;&#x68F5;&#x51B3;&#x7B56;&#x6811;&#x7684;&#x540C;&#x65F6;&#xFF0C; &#x5C06;&#x4EBA;&#x8138;&#x7279;&#x5F81;&#x70B9;&#x8FDB;&#x884C;&#x56DE;&#x5F52;&#x5B66;&#x4E60;&#xFF0C; &#x7528;&#x4EBA;&#x8138;&#x7279;&#x5F81;&#x70B9;&#x6307;&#x5BFC;&#x5206;&#x7C7B;&#x5668;&#x7279;&#x5F81;&#x7684;&#x9009;&#x53D6;&#x3002;</p>
<h2 id="&#x57FA;&#x4E8E;&#x5F39;&#x6027;&#x4E0D;&#x53D8;&#x6A21;&#x578B;&#x7684;&#x4EBA;&#x8138;&#x68C0;&#x6D4B;&#x7B97;&#x6CD5;"><a href="#&#x57FA;&#x4E8E;&#x5F39;&#x6027;&#x4E0D;&#x53D8;&#x6A21;&#x578B;&#x7684;&#x4EBA;&#x8138;&#x68C0;&#x6D4B;&#x7B97;&#x6CD5;" class="headerlink" title="&#x57FA;&#x4E8E;&#x5F39;&#x6027;&#x4E0D;&#x53D8;&#x6A21;&#x578B;&#x7684;&#x4EBA;&#x8138;&#x68C0;&#x6D4B;&#x7B97;&#x6CD5;"></a>&#x57FA;&#x4E8E;&#x5F39;&#x6027;&#x4E0D;&#x53D8;&#x6A21;&#x578B;&#x7684;&#x4EBA;&#x8138;&#x68C0;&#x6D4B;&#x7B97;&#x6CD5;</h2><p>&#x5728;&#x975E;&#x7EA6;&#x675F;&#x573A;&#x666F;&#x4E0B;&#xFF0C; &#x4EBA;&#x8138;&#x7684;&#x8868;&#x60C5;&#x3001;&#x89D2;&#x5EA6;&#x6240;&#x5E26;&#x6765;&#x7684;&#x5F62;&#x53D8;&#x8F83;&#x5927;&#xFF0C; &#x906E;&#x6321;&#x53CA;&#x5149;&#x7167;&#x53D8;&#x5316;&#x4F1A;&#x5F15;&#x5165;&#x566A;&#x58F0;&#x3002; &#x57FA;&#x4E8E;&#x7EA7;&#x8054;&#x7ED3;&#x6784;&#x7684;&#x4EBA;&#x8138;&#x68C0;&#x6D4B;&#x7B97;&#x6CD5;&#x5F80;&#x5F80;&#x662F;&#x5BF9;&#x9884;&#x5148;&#x5B66;&#x4E60;&#x5230;&#x7684;&#x4F4D;&#x7F6E;&#x63D0;&#x53D6;&#x5206;&#x7C7B;&#x7279;&#x5F81;&#xFF0C; &#x5BF9;&#x906E;&#x6321;&#x7B49;&#x566A;&#x58F0;&#x9002;&#x5E94;&#x6027;&#x8F83;&#x5DEE;&#x3002; &#x53E6;&#x5916;&#xFF0C;&#x8FD9;&#x4E9B;&#x65B9;&#x6CD5;&#x5C06;&#x4E0D;&#x540C;&#x8868;&#x60C5;&#x3001;&#x4E0D;&#x540C;&#x89D2;&#x5EA6;&#x7684;&#x4EBA;&#x8138;&#x5F53;&#x6210;&#x591A;&#x4E2A;&#x5B50;&#x7C7B;&#x5904;&#x7406;&#xFF0C; &#x5728;&#x9884;&#x6D4B;&#x65F6;&#x51B3;&#x7B56;&#x6811;&#x6BCF;&#x4E2A;&#x8282;&#x70B9;&#x5C06;&#x4EBA;&#x8138;&#x5212;&#x5206;&#x5230;&#x6A21;&#x5F0F;&#x76F8;&#x540C;&#x7684;&#x7C07; (batch) &#x63D0;&#x53D6;&#x7279;&#x5F81;&#xFF0C; &#x5BF9;&#x4E8E;&#x5F62;&#x53D8;&#x8FC7;&#x5927;&#x7684;&#x4EBA;&#x8138;&#xFF0C; &#x51B3;&#x7B56;&#x6811;&#x53EF;&#x80FD;&#x4F1A;&#x5C06;&#x5176;&#x5212;&#x5206;&#x5230;&#x9519;&#x8BEF;&#x7684;&#x8282;&#x70B9;&#x4E0A;&#xFF0C; &#x5C06;&#x5176;&#x8FC7;&#x65E9;&#x5730;&#x8FC7;&#x6EE4;&#x6389;&#x3002;</p>
<center><img src="/2016/06/07/&#x4EBA;&#x8138;&#x68C0;&#x6D4B;&#x7B97;&#x6CD5;&#x6982;&#x8FF0;/4.png" alt=" TSM ">(a)&#x6587;&#x732E; <a href="#9">[9]</a> &#x6240;&#x4F7F;&#x7528;&#x7684;&#x6DF7;&#x5408;&#x6811;&#x6A21;&#x578B;&#x793A;&#x4F8B;<br><img src="/2016/06/07/&#x4EBA;&#x8138;&#x68C0;&#x6D4B;&#x7B97;&#x6CD5;&#x6982;&#x8FF0;/5.png" alt=" MutiresHPM ">(b)&#x6587;&#x732E; <a href="#40">[40]</a> &#x5E26;&#x906E;&#x6321;&#x7279;&#x5F81;&#x70B9;&#x7684;&#x4EBA;&#x8138;&#x5F39;&#x6027;&#x6A21;&#x578B;&#x793A;&#x4F8B;&#x3002; &#x7EA2;&#x8272;&#x4E3A;&#x906E;&#x6321;&#x7279;&#x5F81;&#x70B9;, &#x7EFF;&#x8272;&#x4E3A;&#x53EF;&#x89C1;&#x7279;&#x5F81;&#x70B9;, &#x53F3;&#x56FE;&#x4E3A;&#x4EBA;&#x8138;&#x5C3A;&#x5EA6;&#x8F83;&#x5C0F;&#x65F6;&#x7684;&#x6A21;&#x578B;<br>&#x56FE; 2-3 &#x5F39;&#x6027;&#x4E0D;&#x53D8;&#x6A21;&#x578B;&#x793A;&#x4F8B;<br><br></center>
<p>&#x57FA;&#x4E8E;&#x5F39;&#x6027;&#x4E0D;&#x53D8;&#x6A21;&#x578B; <a href="#7">[7]</a><a href="#8">[8]</a> &#x7684;&#x4EBA;&#x8138;&#x68C0;&#x6D4B;&#x7B97;&#x6CD5;&#x53EF;&#x4EE5;&#x6709;&#x6548;&#x89E3;&#x51B3;&#x5982;&#x906E;&#x6321;&#x3001;&#x5149;&#x7167;&#x53D8;&#x5316;&#x3001;&#x8868;&#x60C5;&#x53D8;&#x5316;&#x3001;&#x89D2;&#x5EA6;&#x4E0D;&#x4E00;&#x7684;&#x95EE;&#x9898;&#x3002; &#x8FD9;&#x7C7B;&#x65B9;&#x6CD5;&#x5C06;&#x4EBA;&#x8138;&#x5B9A;&#x4E49;&#x4E3A;&#x4EBA;&#x8138;&#x4E0D;&#x540C;&#x90E8;&#x4F4D; (parts) &#x7684;&#x7EC4;&#x5408;&#xFF0C; &#x5982;&#x9F3B;&#x5B50;&#x3001;&#x773C;&#x775B;&#x3001;&#x5634;&#x3001;&#x8033;&#x6735;&#x7B49;&#xFF0C; &#x8FD9;&#x4E9B;&#x4E0D;&#x540C;&#x7684;&#x90E8;&#x4F4D;&#x901A;&#x8FC7;&#x201C;&#x5F39;&#x7C27; (spring)&#x201D;&#x8FDB;&#x884C;&#x7EC4;&#x5408;&#xFF0C; &#x5982;&#x56FE; 2-3 &#x6240;&#x793A;&#x3002; &#x8FD9;&#x4E9B;&#x4EBA;&#x8138;&#x90E8;&#x4F4D;&#x7531;&#x975E;&#x76D1;&#x7763;&#x6216;&#x8005;&#x76D1;&#x7763;&#x7B97;&#x6CD5;&#x8FDB;&#x884C;&#x8BAD;&#x7EC3;&#x5F97;&#x5230;&#x3002; Latent SVM &#x5206;&#x7C7B;&#x5668;&#x88AB;&#x8BAD;&#x7EC3;&#x6765;&#x5728;&#x4EBA;&#x8138;&#x4E0A;&#x627E;&#x5230;&#x8FD9;&#x4E9B;&#x90E8;&#x4F4D;&#x53CA;&#x4ED6;&#x4EEC;&#x95F4;&#x7684;&#x51E0;&#x4F55;&#x5173;&#x7CFB;&#xFF0C; &#x56E0;&#x6B64;&#x8BE5;&#x7C7B;&#x65B9;&#x6CD5;&#x53EF;&#x4EE5;&#x9002;&#x5E94;&#x4EBA;&#x8138;&#x7684;&#x5F62;&#x53D8;&#x3002; &#x53C8;&#x7531;&#x4E8E;&#x662F;&#x5BF9;&#x5C40;&#x90E8;&#x90E8;&#x4F4D;&#x8FDB;&#x884C;&#x7279;&#x5F81;&#x63D0;&#x53D6;&#xFF0C; &#x56E0;&#x6B64;&#xFF0C; &#x8FD9;&#x7C7B;&#x65B9;&#x6CD5;&#x8FD8;&#x80FD;&#x68C0;&#x6D4B;&#x5230;&#x6709;&#x90E8;&#x5206;&#x906E;&#x6321;&#x7684;&#x4EBA;&#x8138; (&#x5982;&#x56FE; 2-4 &#x6240;&#x793A;)&#xFF0C; &#x5BF9;&#x4EBA;&#x8138;&#x906E;&#x6321;&#x60C5;&#x51B5;&#x6709;&#x5F88;&#x597D;&#x7684;&#x9C81;&#x68D2;&#x6027;&#x3002;</p>
<p>&#x4EBA;&#x8138;&#x68C0;&#x6D4B;&#x7B97;&#x6CD5;&#x9700;&#x8981;&#x7684;&#x8BAD;&#x7EC3;&#x6570;&#x636E;&#x5F80;&#x5F80;&#x6BD4;&#x8F83;&#x5927;&#xFF0C; &#x5728;&#x6587;&#x732E; <a href="#9">[9]</a> &#x4E2D;&#x5C06;&#x4EBA;&#x8138;&#x5B9A;&#x4E49;&#x4E3A;&#x82E5;&#x5E72;&#x4E2A;&#x6DF7;&#x5408;&#x6811;&#x6A21;&#x578B;&#xFF0C; &#x6BCF;&#x4E2A;&#x5B50;&#x8282;&#x70B9;&#x5747;&#x7531;&#x4E00;&#x4E2A;&#x7236;&#x8282;&#x70B9;&#x5173;&#x8054;&#xFF0C; &#x53EA;&#x9700;&#x8981;&#x51E0;&#x767E;&#x5F20;&#x6807;&#x8BB0;&#x6709;&#x7279;&#x5F81;&#x70B9;&#x4F4D;&#x7F6E;&#x7684;&#x4EBA;&#x8138;&#x8BAD;&#x7EC3;&#x6570;&#x636E;&#x5C31;&#x53EF;&#x4EE5;&#x5B66;&#x4E60;&#x5230;&#x4E0D;&#x540C;&#x6A21;&#x5F0F;&#x7684;&#x4EBA;&#x8138;&#xFF0C; &#x800C;&#x4E14;&#x5728;&#x68C0;&#x6D4B;&#x4EBA;&#x8138;&#x7684;&#x540C;&#x65F6;&#x5224;&#x65AD;&#x4E86;&#x4EBA;&#x8138;&#x7684;&#x89D2;&#x5EA6;&#x53CA;&#x6807;&#x5B9A;&#x70B9;&#x7684;&#x4F4D;&#x7F6E;&#x3002; &#x6587;&#x732E; <a href="#40">[40]</a> &#x5728;&#x6587;&#x732E; <a href="#9">[9]</a> &#x57FA;&#x7840;&#x4E0A;&#x6269;&#x5C55;&#x4E86;&#x6DF7;&#x5408;&#x6811;&#x6A21;&#x578B;&#x6765;&#x5904;&#x7406;&#x906E;&#x6321;&#xFF0C; &#x5C06;&#x4EBA;&#x8138;&#x90E8;&#x4F4D;&#x8FDB;&#x884C;&#x5206;&#x7EA7;&#xFF0C; &#x5982;&#x773C;&#x775B;&#x3001;&#x9F3B;&#x5B50;&#x3001;&#x5634;&#x5DF4;&#x4E3A;&#x4E00;&#x7EA7;&#xFF0C; &#x8FD9;&#x4E9B;&#x4F4D;&#x7F6E;&#x9644;&#x8FD1;&#x7684;&#x7279;&#x5F81;&#x70B9;&#x4E3A;&#x7B2C;&#x4E8C;&#x7EA7;&#xFF0C; &#x5982;&#x56FE; 2-3(b)&#x3002; &#x8BAD;&#x7EC3;&#x65F6;&#x968F;&#x673A;&#x751F;&#x6210;&#x5E26;&#x906E;&#x6321;&#x7684;&#x4EBA;&#x8138;&#xFF0C; &#x68C0;&#x6D4B;&#x65F6;&#x5F53;&#x4EBA;&#x8138;&#x67D0;&#x4E2A;&#x90E8;&#x4F4D;&#x88AB;&#x906E;&#x6321;&#x65F6;&#xFF0C; &#x5BF9;&#x5206;&#x7C7B;&#x65E0;&#x6548;&#x3002; &#x5C3D;&#x7BA1;&#x8FD9;&#x4E9B;&#x53D8;&#x5F62;&#x91C7;&#x7528;&#x4E86;&#x66F4;&#x52A0;&#x590D;&#x6742;&#x7684;&#x7B56;&#x7565;&#x6765;&#x5904;&#x7406;&#x4EBA;&#x8138;&#x53D8;&#x5F62;&#x53CA;&#x906E;&#x6321;&#xFF0C; &#x6587;&#x732E; <a href="#28">[28]</a> &#x901A;&#x8FC7;&#x6784;&#x5EFA;&#x591A;&#x4E2A;&#x4E0D;&#x540C;&#x89D2;&#x5EA6;&#x3001;&#x4E0D;&#x540C;&#x5C3A;&#x5EA6;&#x7684;&#x5F39;&#x6027;&#x4E0D;&#x53D8;&#x6A21;&#x578B;&#x5206;&#x522B;&#x68C0;&#x6D4B;&#x7279;&#x5B9A;&#x4EBA;&#x8138;&#xFF0C; &#x53D6;&#x5F97;&#x4E86;&#x6BD4;&#x6587;&#x732E; <a href="#9">[9]</a><a href="#41">[41]</a> &#x4E2D;&#x590D;&#x6742;&#x53D8;&#x5F62;&#x66F4;&#x597D;&#x7684;&#x6548;&#x679C;&#x3002;</p>
<center><img src="/2016/06/07/&#x4EBA;&#x8138;&#x68C0;&#x6D4B;&#x7B97;&#x6CD5;&#x6982;&#x8FF0;/6.png" alt=" &#x5F39;&#x6027;&#x4E0D;&#x53D8;&#x6A21;&#x578B;&#x7ED3;&#x679C;&#x793A;&#x4F8B; "> &#x56FE; 2-4 &#x5DE6;&#x56FE;&#x4E3A;&#x6587;&#x732E; <a href="#9">[9]</a> &#x68C0;&#x6D4B;&#x7ED3;&#x679C;&#x3002; &#x53F3;&#x56FE;&#x4E3A;&#x6587;&#x732E; <a href="#40">[40]</a> &#x68C0;&#x6D4B;&#x7ED3;&#x679C;&#xFF0C; &#x7EA2;&#x8272;&#x4E3A;&#x906E;&#x6321;&#x4EBA;&#x8138;&#x90E8;&#x4F4D;<br><br></center>
<p>&#x57FA;&#x4E8E;&#x5F39;&#x6027;&#x4E0D;&#x53D8;&#x6A21;&#x578B;&#x7684;&#x4EBA;&#x8138;&#x68C0;&#x6D4B;&#x5668;&#x8BA1;&#x7B97;&#x91CF;&#x5927;&#xFF0C; &#x4E3B;&#x8981;&#x7531;&#x4E8E;:</p>
<ol>
<li>&#x5BF9;&#x4E8E;&#x6BCF;&#x4E2A;&#x5019;&#x9009;&#x7A97;&#x53E3;&#x90FD;&#x9700;&#x8981;&#x6267;&#x884C; Latent SVM &#x6765;&#x5BFB;&#x627E;&#x4EBA;&#x8138;&#x90E8;&#x4F4D;&#xFF1B;</li>
<li>&#x4E3A;&#x4E86;&#x53EF;&#x4EE5;&#x5904;&#x7406;&#x4E0D;&#x540C;&#x89D2;&#x5EA6;&#x7684;&#x4EBA;&#x8138;&#x68C0;&#x6D4B;&#xFF0C;&#x9700;&#x8981;&#x8BAD;&#x7EC3;&#x591A;&#x4E2A;&#x6A21;&#x578B;&#x5206;&#x522B;&#x8FDB;&#x884C;&#x5904;&#x7406; <a href="#9">[9]</a><a href="#28">[28]</a><a href="#40">[40]</a><a href="#41">[41]</a><a href="#42">[42]</a>&#x3002; </li>
</ol>
<p>&#x53E6;&#x5916;&#xFF0C; &#x57FA;&#x4E8E;&#x5F39;&#x6027;&#x4E0D;&#x53D8;&#x6A21;&#x578B;&#x7684;&#x4E00;&#x4E9B;&#x7B97;&#x6CD5; <a href="#9">[9]</a><a href="#40">[40]</a> &#x9700;&#x8981;&#x8BAD;&#x7EC3;&#x6570;&#x636E;&#x96C6;&#x5305;&#x542B;&#x4EBA;&#x8138;&#x7279;&#x5F81;&#x70B9;&#x7684;&#x6807;&#x5B9A;&#xFF0C; &#x5EFA;&#x7ACB;&#x8FD9;&#x4E9B;&#x6570;&#x636E;&#x96C6;&#x9700;&#x8981;&#x6D88;&#x8017;&#x5927;&#x91CF;&#x4EBA;&#x529B;&#x7269;&#x529B;&#x3002;</p>
<h2 id="&#x57FA;&#x4E8E;&#x795E;&#x7ECF;&#x7F51;&#x7EDC;-&#x6DF1;&#x5EA6;&#x5B66;&#x4E60;&#x7684;&#x4EBA;&#x8138;&#x68C0;&#x6D4B;&#x7B97;&#x6CD5;"><a href="#&#x57FA;&#x4E8E;&#x795E;&#x7ECF;&#x7F51;&#x7EDC;-&#x6DF1;&#x5EA6;&#x5B66;&#x4E60;&#x7684;&#x4EBA;&#x8138;&#x68C0;&#x6D4B;&#x7B97;&#x6CD5;" class="headerlink" title="&#x57FA;&#x4E8E;&#x795E;&#x7ECF;&#x7F51;&#x7EDC;/&#x6DF1;&#x5EA6;&#x5B66;&#x4E60;&#x7684;&#x4EBA;&#x8138;&#x68C0;&#x6D4B;&#x7B97;&#x6CD5;"></a>&#x57FA;&#x4E8E;&#x795E;&#x7ECF;&#x7F51;&#x7EDC;/&#x6DF1;&#x5EA6;&#x5B66;&#x4E60;&#x7684;&#x4EBA;&#x8138;&#x68C0;&#x6D4B;&#x7B97;&#x6CD5;</h2><h3 id="&#x5377;&#x79EF;&#x795E;&#x7ECF;&#x7F51;&#x7EDC;"><a href="#&#x5377;&#x79EF;&#x795E;&#x7ECF;&#x7F51;&#x7EDC;" class="headerlink" title="&#x5377;&#x79EF;&#x795E;&#x7ECF;&#x7F51;&#x7EDC;"></a>&#x5377;&#x79EF;&#x795E;&#x7ECF;&#x7F51;&#x7EDC;</h3><p>&#x4F20;&#x7EDF;&#x4EBA;&#x8138;&#x68C0;&#x6D4B;&#x7B97;&#x6CD5;&#x9700;&#x8981;&#x4EBA;&#x5DE5;&#x8BBE;&#x8BA1;&#x7684;&#x7279;&#x5F81;&#xFF0C; &#x9700;&#x8981;&#x5927;&#x91CF;&#x4E13;&#x4E1A;&#x9886;&#x57DF;&#x77E5;&#x8BC6;&#xFF0C; &#x7EBF;&#x6027;&#x5206;&#x7C7B;&#x5668;&#x5BF9;&#x4EBA;&#x5DE5;&#x63D0;&#x53D6;&#x7684;&#x7279;&#x5F81;&#x8FDB;&#x884C;&#x5206;&#x7C7B;&#xFF0C; &#x53EA;&#x80FD;&#x628A;&#x6837;&#x672C;&#x5206;&#x6210;&#x7B80;&#x5355;&#x7684;&#x533A;&#x57DF;&#x3002; &#x795E;&#x7ECF;&#x7F51;&#x7EDC;&#x6838;&#x5FC3;&#x662F;&#x901A;&#x8FC7;&#x4F7F;&#x7528;&#x81EA;&#x4E3B;&#x5B66;&#x4E60;&#x8FC7;&#x7A0B;&#x6765;&#x5F97;&#x5230;&#x826F;&#x597D;&#x7684;&#x7279;&#x5F81; <a href="#43">[43]</a>&#x3002; &#x7531;&#x4E8E;&#x68AF;&#x5EA6;&#x4E0B;&#x964D;&#x65B9;&#x6CD5;&#x53EF;&#x80FD;&#x4F7F;&#x5F97;&#x7F51;&#x7EDC;&#x9677;&#x5165;&#x5C40;&#x90E8;&#x6700;&#x5C0F;&#x503C;&#xFF0C; &#x5728; 20 &#x4E16;&#x7EAA; 90 &#x5E74;&#x4EE3;&#x795E;&#x7ECF;&#x7F51;&#x7EDC;&#x65B9;&#x6CD5;&#x88AB;&#x7814;&#x7A76;&#x8005;&#x4EEC;&#x6240;&#x629B;&#x5F03;&#x3002; &#x8FD1;&#x5E74;&#x6765;&#xFF0C;&#x968F;&#x7740;&#x7406;&#x8BBA;&#x7814;&#x7A76;&#x53CA;&#x5B9E;&#x8DF5;&#x8868;&#x660E;&#xFF0C; &#x5927;&#x7F51;&#x7EDC;&#x603B;&#x662F;&#x4F1A;&#x5F97;&#x5230;&#x5DEE;&#x4E0D;&#x591A;&#x7684;&#x89E3;&#xFF0C; &#x5C40;&#x90E8;&#x6700;&#x5C0F;&#x503C;&#x5E76;&#x4E0D;&#x4F1A;&#x5BF9;&#x7F51;&#x7EDC;&#x6574;&#x4F53;&#x6027;&#x80FD;&#x9020;&#x6210;&#x5F88;&#x5927;&#x5F71;&#x54CD; <a href="#20">[20]</a>&#x3002; &#x540C;&#x65F6;&#xFF0C; ReLU &#x975E;&#x7EBF;&#x6027;&#x51FD;&#x6570; <a href="#44">[44]</a> &#x7684;&#x63D0;&#x51FA;&#x89E3;&#x51B3;&#x4E86;&#x68AF;&#x5EA6;&#x5F25;&#x6563;&#x95EE;&#x9898;&#xFF0C; dropout &#x601D;&#x60F3; <a href="#45">[45]</a> &#x7684;&#x63D0;&#x51FA;&#x4E00;&#x5B9A;&#x7A0B;&#x5EA6;&#x4E0A;&#x89E3;&#x51B3;&#x4E86;&#x7F51;&#x7EDC;&#x8FC7;&#x62DF;&#x5408;&#x95EE;&#x9898;&#xFF0C; &#x9884;&#x8BAD;&#x7EC3; (pre-trained) &#x8FC7;&#x7A0B;&#x53EF;&#x4EE5;&#x4F7F;&#x5F97;&#x7F51;&#x7EDC;&#x8BAD;&#x7EC3;&#x7684;&#x6548;&#x679C;&#x66F4;&#x597D;&#x7684;&#x53D1;&#x73B0; <a href="#43">[43]</a>&#xFF0C; &#x4F7F;&#x5F97;&#x795E;&#x7ECF;&#x7F51;&#x7EDC;&#x5B66;&#x4E60;&#x7B97;&#x6CD5;&#x91CD;&#x65B0;&#x88AB;&#x7814;&#x7A76;&#x8005;&#x4EEC;&#x5173;&#x6CE8;&#x3002;</p>
<p>&#x5377;&#x79EF;&#x795E;&#x7ECF;&#x7F51;&#x7EDC;&#x91CD;&#x65B0;&#x88AB;&#x8BA1;&#x7B97;&#x673A;&#x89C6;&#x89C9;&#x56E2;&#x961F;&#x53CA;&#x7814;&#x7A76;&#x8005;&#x4EEC;&#x6240;&#x91CD;&#x89C6;&#x662F;&#x5728; 2012 &#x5E74;&#x7684;&#x767E;&#x4E07;&#x56FE;&#x50CF;&#x89C4;&#x6A21;&#x6570;&#x636E;&#x7ADE;&#x8D5B; ImageNet &#x540E;&#xFF0C; &#x8BE5;&#x6570;&#x636E;&#x96C6;&#x5305;&#x542B; $ 1000 $ &#x4E2A;&#x7C7B;&#x522B;&#x7684;&#x7269;&#x4F53;&#xFF0C; &#x6DF1;&#x5EA6;&#x5377;&#x79EF;&#x795E;&#x7ECF;&#x7F51;&#x7EDC;&#x7B97;&#x6CD5;&#x51E0;&#x4E4E;&#x6BD4;&#x5F53;&#x65F6;&#x5176;&#x4ED6;&#x65B9;&#x6CD5;&#x964D;&#x4F4E;&#x4E86; $ 50\% $ &#x7684;&#x9519;&#x8BEF;&#x7387; <a href="#43">[43]</a>&#x3002; &#x5377;&#x79EF;&#x795E;&#x7ECF;&#x7F51;&#x7EDC;&#x88AB;&#x8BBE;&#x8BA1;&#x6210;&#x66F4;&#x5BB9;&#x6613;&#x5730;&#x5904;&#x7406;&#x56FE;&#x50CF;&#x7B49;&#x591A;&#x7EF4;&#x6570;&#x636E;&#xFF0C; &#x5176;&#x4E3B;&#x8981;&#x5305;&#x542B;&#x5377;&#x79EF;&#x5C42;&#x3001;&#x5F52;&#x4E00;&#x5316;&#x5C42;&#x3001;pooling&#x5C42;&#x3002;</p>
<center><img src="/2016/06/07/&#x4EBA;&#x8138;&#x68C0;&#x6D4B;&#x7B97;&#x6CD5;&#x6982;&#x8FF0;/7.png" alt=" &#x5377;&#x79EF;&#x5C42;&#x793A;&#x4F8B; "> &#x56FE;2-5 &#x5377;&#x79EF;&#x5C42;&#x793A;&#x4F8B;&#xFF0C; &#x5176;&#x4E2D;&#xFF0C; $ f_1, f_2, f_3 $&#x4E3A;&#x524D;&#x4E00;&#x5C42;&#x7684;&#x7279;&#x5F81;&#x56FE;&#xFF0C;$ h_1, h_2 $ &#x4E3A;&#x4E0B;&#x4E00;&#x5C42;&#x8F93;&#x51FA;&#x7684;&#x7279;&#x5F81;&#x56FE;<br><br></center>
<p>&#x56FE;&#x50CF;&#x50CF;&#x7D20;&#x76F8;&#x90BB;&#x4F4D;&#x7F6E;&#x5177;&#x6709;&#x5F88;&#x5F3A;&#x7684;&#x76F8;&#x5173;&#x6027;&#xFF0C; &#x5BF9;&#x8FD9;&#x4E9B;&#x4F4D;&#x7F6E;&#x63D0;&#x53D6;&#x7684;&#x7279;&#x5F81;&#x8868;&#x8FBE;&#x6027;&#x66F4;&#x5F3A;&#xFF0C; &#x5377;&#x79EF;&#x795E;&#x7ECF;&#x7F51;&#x7EDC;&#x4F7F;&#x7528;&#x5377;&#x79EF;&#x5C42;&#x5B9E;&#x73B0;&#x8FD9;&#x4E00;&#x529F;&#x80FD;&#xFF0C; &#x5377;&#x79EF;&#x5C42;&#x5982;&#x56FE; 2-5 &#x6240;&#x793A;&#x3002; &#x5377;&#x79EF;&#x5C42;&#x5305;&#x542B;&#x4E00;&#x7EC4;&#x5377;&#x79EF;&#x6838;&#xFF0C; &#x6BCF;&#x4E2A;&#x5377;&#x79EF;&#x6838;&#x4F5C;&#x7528;&#x4E8E;&#x524D;&#x4E00;&#x5C42;&#x7684;&#x7279;&#x5F81;&#x56FE;&#x4E0A;&#xFF0C; &#x4E0A;&#x4E00;&#x5C42;&#x7279;&#x5F81;&#x56FE;&#x7684;&#x52A0;&#x6743;&#x548C;&#x5F97;&#x5230;&#x4E0B;&#x4E00;&#x5C42;&#x7684;&#x7279;&#x5F81;&#x56FE;&#xFF0C; &#x5377;&#x79EF;&#x6838;&#x7C7B;&#x4F3C;&#x6EE4;&#x6CE2;&#x64CD;&#x4F5C;&#x3002; &#x5377;&#x79EF;&#x5C42;&#x662F;&#x4E00;&#x79CD;&#x5C40;&#x90E8;&#x8FDE;&#x63A5;&#xFF0C; &#x5927;&#x5927;&#x51CF;&#x5C11;&#x4E86;&#x5168;&#x8FDE;&#x63A5; (fully connected) &#x5C42;&#x7684;&#x53C2;&#x6570;&#x6570;&#x76EE;&#x3002; &#x5229;&#x7528; ReLU &#x4F5C;&#x4E3A;&#x6FC0;&#x6D3B;&#x51FD;&#x6570;&#xFF0C; &#x5219;&#x5377;&#x79EF;&#x5C42;&#x7279;&#x5F81;&#x56FE;&#x8F93;&#x51FA;&#x4E3A;&#xFF1A;</p>
<p>$$ h_i = max(0, \sum_k f_k*w_i ) $$</p>
<p>&#x5176;&#x4E2D;&#x4E3A; $ w_i $ &#x5F53;&#x524D;&#x5C42;&#x7B2C; $ i $ &#x4E2A;&#x5377;&#x79EF;&#x6838;&#xFF0C; $ f_k $ &#x4E3A;&#x524D;&#x4E00;&#x5C42;&#x7B2C; $ k $ &#x4E2A;&#x7279;&#x5F81;&#x56FE;&#xFF0C;$ h_i $&#x4E3A;&#x5F53;&#x524D;&#x5C42;&#x7B2C; $ i $ &#x4E2A;&#x7279;&#x5F81;&#x56FE;&#x8F93;&#x51FA;&#x3002;</p>
<p>&#x5F52;&#x4E00;&#x5316;&#x5C42;&#x5F80;&#x5F80;&#x63A5;&#x5728;&#x5377;&#x79EF;&#x5C42;&#x540E;&#xFF0C; &#x662F;&#x5BF9;&#x5377;&#x79EF;&#x5C42;&#x5F97;&#x5230;&#x7684;&#x7279;&#x5F81;&#x56FE;&#x7684;&#x5F52;&#x4E00;&#x5316;&#xFF0C; &#x53BB;&#x9664;&#x5149;&#x7167;&#x3001;&#x7EBF;&#x6027;&#x566A;&#x58F0;&#x7B49;&#x5916;&#x754C;&#x56E0;&#x7D20;&#x7684;&#x5F71;&#x54CD;&#xFF0C; &#x589E;&#x5F3A;&#x7279;&#x5F81;&#x8868;&#x8FBE;&#x7684;&#x9002;&#x5E94;&#x6027;&#x3002;</p>
<p>Pooling &#x5C42;&#x662F;&#x4E3A;&#x4E86;&#x8BA9;&#x5377;&#x79EF;&#x5C42;&#x63D0;&#x53D6;&#x7684;&#x7279;&#x5F81;&#x66F4;&#x52A0;&#x9C81;&#x68D2;&#x3002; &#x8BE5;&#x5C42;&#x8BA1;&#x7B97;&#x7279;&#x5F81;&#x56FE;&#x5C40;&#x90E8;&#x6700;&#x5C0F;&#x90BB;&#x57DF;&#x7684;&#x6700;&#x5927;&#x503C; (max-pooling) &#x6216;&#x8005;&#x5E73;&#x5747;&#x503C; (avg-pooling)&#xFF0C; &#x4E00;&#x65B9;&#x9762;&#x5BF9;&#x5377;&#x79EF;&#x5C42;&#x5F97;&#x5230;&#x7684;&#x7279;&#x5F81;&#x8FDB;&#x884C;&#x4E86;&#x964D;&#x7EF4;&#xFF0C; &#x53E6;&#x4E00;&#x65B9;&#x9762;&#x51CF;&#x5C11;&#x4E86;&#x566A;&#x58F0;&#x5E72;&#x6270;&#xFF0C; &#x4F7F;&#x5F97;&#x7279;&#x5F81;&#x66F4;&#x52A0;&#x7A81;&#x51FA;&#x3002;</p>
<h3 id="&#x57FA;&#x4E8E;&#x795E;&#x7ECF;&#x7F51;&#x7EDC;-&#x6DF1;&#x5EA6;&#x5B66;&#x4E60;&#x7684;&#x4EBA;&#x8138;&#x68C0;&#x6D4B;&#x7B97;&#x6CD5;-1"><a href="#&#x57FA;&#x4E8E;&#x795E;&#x7ECF;&#x7F51;&#x7EDC;-&#x6DF1;&#x5EA6;&#x5B66;&#x4E60;&#x7684;&#x4EBA;&#x8138;&#x68C0;&#x6D4B;&#x7B97;&#x6CD5;-1" class="headerlink" title="&#x57FA;&#x4E8E;&#x795E;&#x7ECF;&#x7F51;&#x7EDC;/&#x6DF1;&#x5EA6;&#x5B66;&#x4E60;&#x7684;&#x4EBA;&#x8138;&#x68C0;&#x6D4B;&#x7B97;&#x6CD5;"></a>&#x57FA;&#x4E8E;&#x795E;&#x7ECF;&#x7F51;&#x7EDC;/&#x6DF1;&#x5EA6;&#x5B66;&#x4E60;&#x7684;&#x4EBA;&#x8138;&#x68C0;&#x6D4B;&#x7B97;&#x6CD5;</h3><p>&#x57FA;&#x4E8E;&#x795E;&#x7ECF;&#x7F51;&#x7EDC;&#x7684;&#x4EBA;&#x8138;&#x68C0;&#x6D4B;&#x7B97;&#x6CD5;&#x5386;&#x53F2;&#x60A0;&#x4E45; <a href="#46">[46]</a>-<a href="#53">[53]</a>&#x3002; &#x6587;&#x732E; <a href="#46">[46]</a><a href="#47">[47]</a> &#x57FA;&#x4E8E;&#x6D45;&#x5C42;&#x5377;&#x79EF;&#x795E;&#x7ECF;&#x7F51;&#x7EDC;&#x8BAD;&#x7EC3;&#x4E86;&#x4E00;&#x4E2A;&#x4E24;&#x9636;&#x6BB5;&#x4EBA;&#x8138;&#x68C0;&#x6D4B;&#x7CFB;&#x7EDF;&#xFF0C; &#x5728;&#x7B2C;&#x4E00;&#x4E2A;&#x9636;&#x6BB5;&#xFF0C; &#x8BAD;&#x7EC3;&#x4E86;&#x4E00;&#x4E2A;&#x7F51;&#x7EDC;&#x7C97;&#x7565;&#x5B9A;&#x4F4D;&#x4EBA;&#x8138;&#x7684;&#x4F4D;&#x7F6E;&#xFF0C; &#x7B2C;&#x4E8C;&#x4E2A;&#x9636;&#x6BB5;&#x5219;&#x4F7F;&#x7528;&#x53E6;&#x5916;&#x4E00;&#x4E2A;&#x7F51;&#x7EDC;&#x6765;&#x9A8C;&#x8BC1;&#x8FD9;&#x4E9B;&#x4F4D;&#x7F6E;&#x662F;&#x5426;&#x5305;&#x542B;&#x4EBA;&#x8138;&#xFF0C; &#x5E76;&#x8C03;&#x6574;&#x4E86;&#x68C0;&#x6D4B;&#x6846;&#x3002; &#x5355;&#x4E2A;&#x7F51;&#x7EDC;&#x53EF;&#x80FD;&#x5F97;&#x5230;&#x5C40;&#x90E8;&#x6700;&#x4F18;&#x503C;&#xFF0C; &#x6587;&#x732E; <a href="#48">[48]</a> &#x5728;&#x76F8;&#x540C;&#x7684;&#x8BAD;&#x7EC3;&#x6570;&#x636E;&#x96C6;&#x4E0A;&#x5206;&#x522B;&#x91C7;&#x7528;&#x4E0D;&#x540C;&#x7684;&#x968F;&#x673A;&#x521D;&#x59CB;&#x5316;&#x53C2;&#x6570;&#x8BAD;&#x7EC3;&#x4E86;&#x82E5;&#x5E72;&#x4E2A;&#x6D45;&#x5C42;&#x795E;&#x7ECF;&#x7F51;&#x7EDC;&#xFF0C; &#x4EE5;&#x6B64;&#x6765;&#x907F;&#x514D;&#x8BE5;&#x95EE;&#x9898;&#x3002; &#x68C0;&#x6D4B;&#x65F6;&#x56FE;&#x50CF;&#x88AB;&#x7F29;&#x653E;&#x5230;&#x591A;&#x4E2A;&#x5C3A;&#x5EA6;&#x4E0A;&#xFF0C; &#x6BCF;&#x4E2A;&#x7F51;&#x7EDC;&#x5BF9;&#x56FE;&#x50CF;&#x8F93;&#x51FA;&#x4EBA;&#x8138;&#x4F4D;&#x7F6E;&#xFF0C; &#x6765;&#x81EA;&#x8FD9;&#x4E9B;&#x6D45;&#x5C42;&#x795E;&#x7ECF;&#x7F51;&#x7EDC;&#x7684;&#x68C0;&#x6D4B;&#x7ED3;&#x679C;&#x7ECF;&#x8FC7;&#x4E00;&#x7CFB;&#x5217;&#x7684;&#x6B65;&#x9AA4;&#x8FDB;&#x884C;&#x878D;&#x5408;&#xFF0C; &#x5F97;&#x5230;&#x4E86;&#x6BD4;&#x5355;&#x4E2A;&#x7F51;&#x7EDC;&#x66F4;&#x597D;&#x7684;&#x7ED3;&#x679C;&#x3002;</p>
<center><img src="/2016/06/07/&#x4EBA;&#x8138;&#x68C0;&#x6D4B;&#x7B97;&#x6CD5;&#x6982;&#x8FF0;/8.png" alt=" DDFD&#x793A;&#x4F8B; "> &#x56FE;2-6 &#x6587;&#x732E; <a href="#13">[13]</a> &#x7F51;&#x7EDC;&#x8F93;&#x51FA;&#x7684;&#x4EBA;&#x8138;&#x6982;&#x7387;&#x5206;&#x5E03;&#x56FE;&#x793A;&#x4F8B;&#x3002; &#x5DE6;&#x56FE;&#x4E3A;&#x539F;&#x56FE;, &#x53F3;&#x56FE;&#x4E3A;&#x5176;&#x6982;&#x7387;&#x5206;&#x5E03;&#x56FE;, &#x7EA2;&#x8272;&#x533A;&#x57DF;&#x8868;&#x793A;&#x4EBA;&#x8138;&#x51FA;&#x73B0;&#x6982;&#x7387;&#x9AD8;&#x7684;&#x533A;&#x57DF;, &#x84DD;&#x8272;&#x5219;&#x8868;&#x793A;&#x4EBA;&#x8138;&#x51FA;&#x73B0;&#x6982;&#x7387;&#x4F4E;&#x7684;&#x533A;&#x57DF;&#xFF08;&#x4F7F;&#x7528;&#x4E86;&#x7F51;&#x7AD9;<a href="https://github.com/guoyilin/FaceDetection_CNN" target="_blank" rel="external">https://github.com/guoyilin/FaceDetection_CNN</a> &#x7684;&#x6A21;&#x578B;&#xFF09;&#x3002;<br><br></center>
<p>&#x66F4;&#x6DF1;&#x7684;&#x7F51;&#x7EDC;&#x62E5;&#x6709;&#x66F4;&#x597D;&#x7684;&#x4EBA;&#x8138;&#x68C0;&#x6D4B;&#x6027;&#x80FD;&#x3002; &#x6587;&#x732E; <a href="#49">[49]</a> &#x8BAD;&#x7EC3;&#x4E86;&#x5355;&#x4E2A;&#x6D45;&#x5C42;&#x5377;&#x79EF;&#x795E;&#x7ECF;&#x7F51;&#x7EDC;&#x6765;&#x8FDB;&#x884C;&#x4EBA;&#x8138;&#x68C0;&#x6D4B;&#xFF0C; &#x8BE5;&#x7F51;&#x7EDC;&#x5305;&#x542B;&#x4E24;&#x5C42;&#x5377;&#x79EF;&#x5C42;&#x4E0E; Pooling &#x5C42;&#xFF0C; &#x5E76;&#x901A;&#x8FC7;&#x6743;&#x91CD;&#x5171;&#x4EAB;&#x5C06;&#x7F51;&#x7EDC;&#x53C2;&#x6570;&#x51CF;&#x5C11;&#x3002; &#x4E0E;&#x8FC7;&#x53BB;&#x65B9;&#x6CD5;&#x53EA;&#x5C06;&#x4EBA;&#x8138;&#x5C0F;&#x8303;&#x56F4;&#x65CB;&#x8F6C;&#x5EA6;&#x8FDB;&#x884C;&#x8BAD;&#x7EC3;&#x96C6;&#x6269;&#x5145;&#x4E0D;&#x540C;&#xFF0C; &#x5728;&#x8BAD;&#x7EC3;&#x65F6;&#xFF0C; &#x8BE5;&#x7B97;&#x6CD5;&#x5C06;&#x4EBA;&#x8138;&#x6570;&#x636E;&#x96C6;&#x5DE6;&#x53F3;&#x65CB;&#x8F6C;&#x5EA6;&#x53CA;&#x4EAE;&#x5EA6;&#x5F52;&#x4E00;&#x5316;&#x5904;&#x7406;&#x5F97;&#x5230;&#x66F4;&#x591A;&#x8BAD;&#x7EC3;&#x6837;&#x672C;&#xFF0C; &#x4F7F;&#x5F97;&#x7F51;&#x7EDC;&#x66F4;&#x52A0;&#x9002;&#x5E94;&#x4EBA;&#x8138;&#x7684;&#x65CB;&#x8F6C;&#x548C;&#x4EAE;&#x5EA6;&#x53D8;&#x5316;&#x3002; &#x6587;&#x732E; <a href="#53">[53]</a> &#x4E0E;&#x6587;&#x732E; <a href="#49">[49]</a> &#x4E00;&#x6837;&#x4F7F;&#x7528;&#x4E86;&#x4E24;&#x4E2A;&#x5377;&#x79EF;&#x5C42;&#x548C; Pooling &#x5C42;&#xFF0C; &#x4E0D;&#x540C;&#x7684;&#x662F;&#x521B;&#x9020;&#x6027;&#x5728;&#x6D45;&#x5C42;&#x795E;&#x7ECF;&#x7F51;&#x7EDC;&#x91CC;&#x5F15;&#x5165;&#x4E86;&#x591A;&#x4EFB;&#x52A1;&#x635F;&#x5931;&#x51FD;&#x6570;&#x8FDB;&#x884C;&#x5B66;&#x4E60;&#xFF0C; &#x8BE5;&#x51FD;&#x6570;&#x5305;&#x542B;&#x4E86;&#x4E24;&#x90E8;&#x5206;&#xFF0C; &#x4E00;&#x90E8;&#x5206;&#x4E3A;&#x4EBA;&#x8138;&#x68C0;&#x6D4B;&#x7684;&#x635F;&#x5931;&#x51FD;&#x6570;&#xFF0C; &#x7B2C;&#x4E8C;&#x90E8;&#x5206;&#x662F;&#x4EBA;&#x8138;&#x89D2;&#x5EA6;&#x9884;&#x6D4B;&#x7684;&#x635F;&#x5931;&#x51FD;&#x6570;&#x3002; &#x901A;&#x8FC7;&#x8FD9;&#x79CD;&#x65B9;&#x5F0F;&#xFF0C; &#x795E;&#x7ECF;&#x7F51;&#x7EDC;&#x4E0D;&#x4EC5;&#x80FD;&#x68C0;&#x6D4B;&#x5230;&#x4EBA;&#x8138;&#xFF0C; &#x8FD8;&#x80FD;&#x9884;&#x6D4B;&#x51FA;&#x4EBA;&#x8138;&#x6240;&#x5728;&#x7684;&#x89D2;&#x5EA6;&#x3002;</p>
<p>&#x968F;&#x7740;&#x6DF1;&#x5EA6;&#x5B66;&#x4E60;&#x7684;&#x91CD;&#x65B0;&#x5174;&#x8D77;&#x53CA; GPU &#x786C;&#x4EF6;&#x7684;&#x652F;&#x6301;&#xFF0C; &#x57FA;&#x4E8E;&#x795E;&#x7ECF;&#x7F51;&#x7EDC;&#x7684;&#x4EBA;&#x8138;&#x68C0;&#x6D4B;&#x7B97;&#x6CD5;&#x6240;&#x4F7F;&#x7528;&#x7684;&#x7F51;&#x7EDC;&#x6CBF;&#x7740;&#x66F4;&#x6DF1;&#x66F4;&#x5E7F;&#x7684;&#x8D8B;&#x52BF;&#x53D1;&#x5C55;&#x3002; &#x6587;&#x732E;<a href="#13">[13]</a> &#x5728;&#x6587;&#x732E; <a href="#49">[49]</a> &#x7684;&#x57FA;&#x7840;&#x4E0A;&#xFF0C; &#x4F7F;&#x7528; GPU &#x8FDB;&#x884C;&#x8BAD;&#x7EC3;&#x5B66;&#x4E60;&#x4E86;&#x66F4;&#x6DF1;&#x7684;&#x795E;&#x7ECF;&#x7F51;&#x7EDC; AlexNet <a href="#12">[12]</a><a href="#14">[14]</a>&#xFF0C; &#x5176;&#x7F51;&#x7EDC;&#x62E5;&#x6709;&#x4E94;&#x5C42;&#x5377;&#x79EF;&#x5C42;&#x548C;&#x4E24;&#x5C42; Pooling &#x5C42;&#x3002; &#x4E0E;&#x6587;&#x732E; <a href="#49">[49]</a> &#x76F8;&#x6BD4;&#xFF0C; &#x6700;&#x5927;&#x4E0D;&#x540C;&#x5728;&#x4E8E;:</p>
<ol>
<li>&#x7F51;&#x7EDC;&#x66F4;&#x6DF1;&#x66F4;&#x5E7F;&#xFF0C; &#x4F7F;&#x7528;&#x4E86; ReLU &#x975E;&#x7EBF;&#x6027;&#x51FD;&#x6570;&#x3001;dropout &#x51FD;&#x6570;&#x8FDB;&#x884C;&#x8BAD;&#x7EC3;&#xFF1B;</li>
<li>&#x4F7F;&#x7528;&#x4E86;&#x5728;&#x8D85;&#x5927;&#x578B; ImageNet &#x6570;&#x636E;&#x96C6;&#x4E0A;&#x9884;&#x8BAD;&#x7EC3;&#x597D;&#x7684;&#x6A21;&#x578B; AlexNet&#xFF0C; &#x5176;&#x6A21;&#x578B;&#x672C;&#x8EAB;&#x521D;&#x59CB;&#x5316;&#x7684;&#x6743;&#x503C;&#x62E5;&#x6709;&#x610F;&#x4E49;&#xFF1B;</li>
<li>&#x4FEE;&#x6539;&#x4E86;&#x5168;&#x8FDE;&#x63A5;&#x5C42;&#x4F7F;&#x5176;&#x53EF;&#x4EE5;&#x8F93;&#x51FA;&#x6BCF;&#x4E2A;&#x4F4D;&#x7F6E;&#x4E0A;&#x7684;&#x4EBA;&#x8138;&#x54CD;&#x5E94;&#xFF0C; &#x901A;&#x8FC7;&#x626B;&#x63CF;&#x7A97;&#x53E3;&#x5F97;&#x5230;&#x4EBA;&#x8138;&#x7684;&#x68C0;&#x6D4B;&#x7ED3;&#x679C;&#xFF0C; &#x5982;&#x56FE; 2-6 &#x6240;&#x793A;&#xFF1B;</li>
<li>&#x4F7F;&#x7528;&#x4E86;&#x66F4;&#x5927;&#x7684;&#x6570;&#x636E;&#x96C6;&#x8FDB;&#x884C;&#x8BAD;&#x7EC3;&#xFF0C; &#x968F;&#x673A;&#x91C7;&#x6837;&#x4E86; 200&#xFF0C;000 &#x5F20;&#x4EBA;&#x8138;&#x53CA; 20&#xFF0C;000&#xFF0C;000 &#x4E2A;&#x8D1F;&#x6837;&#x672C;&#xFF0C; &#x5E76;&#x4E3A;&#x4E86;&#x4FDD;&#x6301;&#x8BAD;&#x7EC3;&#x6570;&#x636E;&#x5747;&#x5300;&#xFF0C; &#x6BCF;&#x6279; (batch) &#x4F7F;&#x7528; 32 &#x4E2A;&#x6B63;&#x6837;&#x672C;&#x53CA; 96 &#x4E2A;&#x8D1F;&#x6837;&#x672C;&#x8FDB;&#x884C;&#x8BAD;&#x7EC3;&#x3002; </li>
</ol>
<p>&#x6587;&#x732E; <a href="#13">[13]</a> &#x4F7F;&#x7528;&#x5355;&#x4E00;&#x6A21;&#x578B;&#x53D6;&#x5F97;&#x4E86;&#x4E0E;&#x57FA;&#x4E8E;&#x7EA7;&#x8054;&#x7ED3;&#x6784;&#x548C;&#x5F39;&#x6027;&#x4E0D;&#x53D8;&#x6A21;&#x578B;&#x7684;&#x4EBA;&#x8138;&#x68C0;&#x6D4B;&#x7B97;&#x6CD5;&#x76F8;&#x4F3C;&#x7684;&#x68C0;&#x6D4B;&#x6548;&#x679C;&#x3002; &#x591A;&#x901A;&#x9053;&#x7279;&#x5F81;&#x5728;&#x4EBA;&#x8138;&#x8868;&#x793A;&#x65B9;&#x9762;&#x6709;&#x6BD4; HOG&#xFF0C; SURF &#x7B49;&#x7279;&#x5F81;&#x66F4;&#x5F3A;&#x7684;&#x8868;&#x8FBE;&#x6027;&#xFF0C; &#x6DF1;&#x5EA6;&#x5377;&#x79EF;&#x7F51;&#x7EDC;&#x5B66;&#x4E60;&#x5230;&#x7684;&#x4EBA;&#x8138;&#x7279;&#x5F81;&#x56FE;&#x662F;&#x5BF9;&#x4EBA;&#x8138;&#x7684;&#x9AD8;&#x5C42;&#x6B21;&#x7684;&#x62BD;&#x8C61;&#x8868;&#x793A;&#xFF0C; &#x800C;&#x5206;&#x5E03;&#x5F0F;&#x7279;&#x5F81;&#x8868;&#x793A;&#x65B9;&#x5F0F; (&#x5982;&#x56FE; 2-7) &#x4F7F;&#x5F97;&#x7F51;&#x7EDC;&#x7684;&#x6743;&#x91CD;&#x80FD;&#x5B66;&#x4E60;&#x5230;&#x4EBA;&#x8138;&#x6709;&#x663E;&#x8457;&#x7279;&#x5F81;&#x7684;&#x90E8;&#x4F4D;&#xFF0C; &#x5373;&#x80FD;&#x63D0;&#x53D6;&#x5230;&#x5C40;&#x90E8;&#x7279;&#x5F81;&#x3002; &#x6587;&#x732E;<a href="#54">[54]</a> &#x8FDB;&#x4E00;&#x6B65;&#x6269;&#x5C55;&#x4E86;&#x591A;&#x901A;&#x9053;&#x7279;&#x5F81;&#x4E3A;&#x6DF1;&#x5EA6;&#x5377;&#x79EF;&#x7F51;&#x7EDC;&#x5B66;&#x4E60;&#x5230;&#x7684;&#x7279;&#x5F81;&#x56FE;&#xFF0C; &#x5B9E;&#x9A8C;&#x8868;&#x660E;&#xFF0C; &#x8FD9;&#x4E9B;&#x7279;&#x5F81;&#x56FE;&#x6BD4;&#x591A;&#x901A;&#x9053;&#x7279;&#x5F81;&#x6709;&#x66F4;&#x597D;&#x7684;&#x8868;&#x8FBE;&#x6027;&#x3002;</p>
<center><img src="/2016/06/07/&#x4EBA;&#x8138;&#x68C0;&#x6D4B;&#x7B97;&#x6CD5;&#x6982;&#x8FF0;/9.png" alt=" &#x5206;&#x5E03;&#x5F0F;&#x7279;&#x5F81;&#x8868;&#x793A;&#x65B9;&#x5F0F; ">&#x56FE; 2-7 &#x5206;&#x5E03;&#x5F0F;&#x7279;&#x5F81;&#x8868;&#x793A;&#x65B9;&#x5F0F;<br><br></center>
<p>&#x9075;&#x5FAA; coarse-to-fine &#x539F;&#x5219;&#x662F;&#x5F53;&#x524D;&#x57FA;&#x4E8E;&#x6DF1;&#x5EA6;&#x5377;&#x79EF;&#x7F51;&#x7EDC;&#x7684;&#x4EBA;&#x8138;&#x68C0;&#x6D4B;&#x7B97;&#x6CD5;&#x7684;&#x91CD;&#x8981;&#x53D1;&#x5C55;&#x8D8B;&#x52BF;&#x3002; &#x57FA;&#x4E8E;&#x7EA7;&#x8054;&#x7ED3;&#x6784;&#x7684;&#x4EBA;&#x8138;&#x68C0;&#x6D4B;&#x7B97;&#x6CD5; <a href="#39">[39]</a> &#x5728;&#x68C0;&#x6D4B;&#x4EBA;&#x8138;&#x540C;&#x65F6;&#x8FDB;&#x884C;&#x4EBA;&#x8138;&#x6807;&#x5B9A;&#x70B9;&#x62DF;&#x5408;&#x6765;&#x53D6;&#x5F97;&#x66F4;&#x597D;&#x4EBA;&#x8138;&#x68C0;&#x6D4B;&#x6846;&#x4F4D;&#x7F6E;&#xFF0C; &#x6587;&#x732E;<a href="#55">[55]</a> &#x5219;&#x63D0;&#x51FA;&#x4E86;&#x57FA;&#x4E8E;&#x7EA7;&#x8054;&#x7ED3;&#x6784;&#x7684;&#x5377;&#x79EF;&#x7F51;&#x7EDC;&#x7B97;&#x6CD5;&#x3002; &#x8BE5;&#x7B97;&#x6CD5;&#x540C;&#x6837;&#x5728;&#x4EBA;&#x8138;&#x68C0;&#x6D4B;&#x65F6;&#x8003;&#x8651;&#x5230;&#x4EBA;&#x8138;&#x77EB;&#x6B63;&#x4EE5;&#x83B7;&#x5F97;&#x66F4;&#x9AD8;&#x6027;&#x80FD;&#xFF0C; &#x5171;&#x6709;&#x4E09;&#x4E2A;&#x9636;&#x6BB5;&#xFF0C;&#x6BCF;&#x4E2A;&#x9636;&#x6BB5;&#x5747;&#x5305;&#x542B;&#x6709;&#x4E00;&#x4E2A;&#x7684;&#x68C0;&#x6D4B;&#x7F51;&#x7EDC;&#xFF0C; &#x540E;&#x4E00;&#x9636;&#x6BB5;&#x6BD4;&#x524D;&#x4E00;&#x9636;&#x6BB5;&#x7F51;&#x7EDC;&#x8981;&#x66F4;&#x5927;&#xFF0C; &#x5206;&#x7C7B;&#x6027;&#x80FD;&#x66F4;&#x5F3A;&#x3002; &#x6BCF;&#x4E2A;&#x9636;&#x6BB5;&#x7684;&#x7F51;&#x7EDC;&#x8F93;&#x51FA;&#x4F1A;&#x7ECF;&#x8FC7;&#x5C3A;&#x5EA6;&#x3001;&#x957F;&#x5BBD;&#x3001;&#x4F4D;&#x7F6E;&#x8C03;&#x6574;&#x4EA7;&#x751F;&#x82E5;&#x5E72;&#x4E2A;&#x5019;&#x9009;&#x533A;&#x57DF;&#x518D;&#x6B21;&#x8FDB;&#x884C;&#x68C0;&#x6D4B;&#xFF0C; &#x4FDD;&#x7559;&#x5F97;&#x5206;&#x6BD4;&#x8F83;&#x597D;&#x7684;&#x533A;&#x57DF;&#x4F5C;&#x4E3A;&#x4E0B;&#x4E00;&#x9636;&#x6BB5;&#x7684;&#x8F93;&#x5165;&#xFF0C; &#x4EE5;&#x6B64;&#x5C06;&#x8FD9;&#x4E9B;&#x533A;&#x57DF;&#x9010;&#x6E10;&#x8C03;&#x6574;&#x5230;&#x66F4;&#x7CBE;&#x786E;&#x7684;&#x4EBA;&#x8138;&#x4F4D;&#x7F6E;&#x4E0A;&#x3002; Yang&#x7B49;&#x4EBA;<a href="#56">[56]</a> &#x91C7;&#x7528;&#x4E0E;&#x6587;&#x732E; <a href="#46">[46]</a> &#x76F8;&#x4F3C;&#x7684;&#x7B56;&#x7565;&#xFF0C; &#x63D0;&#x51FA;&#x4E86;&#x53CC;&#x9636;&#x6BB5;&#x4EBA;&#x8138;&#x68C0;&#x6D4B;&#x5668;&#xFF0C; &#x4F46;&#x6DF1;&#x5EA6;&#x8981;&#x66F4;&#x52A0;&#x6DF1;&#xFF0C; &#x5BF9;&#x6BCF;&#x4E2A;&#x4EBA;&#x8138;&#x90E8;&#x4F4D;&#x751F;&#x6210;&#x54CD;&#x5E94;&#x56FE;&#x8FC7;&#x6EE4;&#x5F97;&#x5206;&#x8FC7;&#x4F4E;&#x7684;&#x4EBA;&#x8138;&#x5019;&#x9009;&#x533A;&#x57DF;&#xFF0C; &#x5982;&#x56FE; 2-8&#xFF0C; &#x5E76;&#x901A;&#x8FC7;&#x63A5;&#x5728;&#x5176;&#x540E;&#x7684;&#x68C0;&#x6D4B;&#x7F51;&#x7EDC;&#x5F97;&#x5230;&#x5BF9;&#x5019;&#x9009;&#x533A;&#x57DF;&#x8FDB;&#x884C;&#x66F4;&#x52A0;&#x4E25;&#x683C;&#x7684;&#x5206;&#x7C7B;&#x4E0E;&#x8C03;&#x6574;&#x3002;</p>
<center><img src="/2016/06/07/&#x4EBA;&#x8138;&#x68C0;&#x6D4B;&#x7B97;&#x6CD5;&#x6982;&#x8FF0;/10.png" alt=" &#x5206;&#x5E03;&#x5F0F;&#x7279;&#x5F81;&#x8868;&#x793A;&#x65B9;&#x5F0F; "> &#x56FE;2-8 &#x4EBA;&#x8138;&#x90E8;&#x4F4D;&#x54CD;&#x5E94;&#x56FE;&#x3002; &#x5DE6;&#x4E0A;&#x89D2;&#x4E3A;&#x539F;&#x56FE;&#xFF0C;&#x4ECE;&#x5DE6;&#x5230;&#x53F3;&#x4ECE;&#x4E0A;&#x5230;&#x4E0B;&#x5206;&#x522B;&#x4E3A;&#x8BE5;&#x56FE;&#x5934;&#x53D1;&#x3001;&#x773C;&#x775B;&#x3001;&#x9F3B;&#x5B50;&#x3001;&#x5634;&#x5DF4;&#x3001;&#x4E0B;&#x5DF4;&#x7684;&#x54CD;&#x5E94;&#x56FE;<br><br></center>
<h2 id="&#x5C0F;&#x7ED3;"><a href="#&#x5C0F;&#x7ED3;" class="headerlink" title="&#x5C0F;&#x7ED3;"></a>&#x5C0F;&#x7ED3;</h2><p>&#x672C;&#x6587;&#x4ECE;&#x4E09;&#x4E2A;&#x5206;&#x652F;&#x4E0A;&#x6982;&#x8FF0;&#x4E86;&#x4EBA;&#x8138;&#x68C0;&#x6D4B;&#x7684;&#x7B97;&#x6CD5;&#x3002;&#x7279;&#x5F81;&#x8868;&#x8FBE;&#x65B9;&#x9762;&#xFF0C; &#x57FA;&#x4E8E;&#x7EA7;&#x8054;&#x7ED3;&#x6784;&#x53CA;&#x5F39;&#x6027;&#x4E0D;&#x53D8;&#x6A21;&#x578B;&#x7684;&#x4EBA;&#x8138;&#x68C0;&#x6D4B;&#x7B97;&#x6CD5;&#x591A;&#x662F;&#x4EBA;&#x5DE5;&#x8BBE;&#x8BA1;&#x7684;&#xFF0C; &#x800C;&#x795E;&#x7ECF;&#x7F51;&#x7EDC;/&#x6DF1;&#x5EA6;&#x5B66;&#x4E60;&#x5219;&#x662F;&#x901A;&#x8FC7;&#x7F51;&#x7EDC;&#x5B66;&#x4E60;&#x4EBA;&#x8138;&#x7684;&#x7279;&#x5F81;&#x56FE;&#xFF0C; &#x5177;&#x6709;&#x5206;&#x5E03;&#x5F0F;&#x7279;&#x5F81;&#x8868;&#x793A;&#x65B9;&#x5F0F;&#x3002; &#x5C3D;&#x7BA1;&#x5404;&#x4E2A;&#x5206;&#x652F;&#x7684;&#x5904;&#x7406;&#x65B9;&#x6CD5;&#x4E0D;&#x4E00;&#xFF0C; &#x4F46;&#x53EF;&#x4EE5;&#x770B;&#x5230;&#x8FD9;&#x4E09;&#x7C7B;&#x65B9;&#x6CD5;&#x7684;&#x672C;&#x8D28;&#x90FD;&#x662F;&#x4E00;&#x6837;&#x7684;&#xFF0C; &#x90FD;&#x662F;&#x63D0;&#x53D6;&#x4EBA;&#x8138;&#x7279;&#x5F81;&#x8FDB;&#x884C;&#x5206;&#x7C7B;&#xFF0C; &#x68C0;&#x6D4B;&#x51FA;&#x56FE;&#x50CF;&#x4E2D;&#x6240;&#x6709;&#x4EBA;&#x8138;&#x51FA;&#x73B0;&#x7684;&#x4F4D;&#x7F6E;&#x3002; &#x8FD9;&#x4E09;&#x8005;&#x57FA;&#x672C;&#x7684;&#x4E0D;&#x540C;&#x70B9;&#x5728;&#x4E8E;&#xFF0C; &#x57FA;&#x4E8E;&#x7EA7;&#x8054;&#x7ED3;&#x6784;&#x7684;&#x7B97;&#x6CD5;&#x8003;&#x8651;&#x5230;&#x4E86;&#x56FE;&#x50CF;&#x4E2D;&#x8D1F;&#x6837;&#x672C;&#x6570;&#x76EE;&#x5E9E;&#x5927;&#x7684;&#x56E0;&#x7D20;&#xFF0C; &#x5728;&#x68C0;&#x6D4B;&#x65F6;&#x628A;&#x8D1F;&#x6837;&#x672C;&#x66F4;&#x65E9;&#x5730;&#x53BB;&#x9664;&#x63D0;&#x9AD8;&#x4E86;&#x6574;&#x4F53;&#x68C0;&#x6D4B;&#x7684;&#x6548;&#x7387;&#x3002; &#x57FA;&#x4E8E;&#x5F39;&#x6027;&#x4E0D;&#x53D8;&#x6A21;&#x578B;&#x7684;&#x7B97;&#x6CD5;&#x9488;&#x5BF9;&#x4EBA;&#x8138;&#x5404;&#x90E8;&#x5206;&#x5C40;&#x90E8;&#x7279;&#x5F81;&#x54CD;&#x5E94;&#x5BFB;&#x627E;&#x56FE;&#x50CF;&#x4E2D;&#x7684;&#x4EBA;&#x8138;&#x3002; &#x57FA;&#x4E8E;&#x795E;&#x7ECF;&#x7F51;&#x7EDC;/&#x6DF1;&#x5EA6;&#x5B66;&#x4E60;&#x7684;&#x7B97;&#x6CD5;&#x81EA;&#x4E3B;&#x5B66;&#x4E60;&#x4EBA;&#x8138;&#x5C40;&#x90E8;&#x53CA;&#x6574;&#x4F53;&#x7279;&#x5F81;&#x3002;</p>
<h2 id="&#x53C2;&#x8003;&#x6587;&#x732E;"><a href="#&#x53C2;&#x8003;&#x6587;&#x732E;" class="headerlink" title="&#x53C2;&#x8003;&#x6587;&#x732E;"></a>&#x53C2;&#x8003;&#x6587;&#x732E;</h2><ol>
<li><span id="1"> P. Viola, M. Jones. Rapid object detection using a boosted cascade of simple features[C], IEEE Conference on Computer Vision and Pattern Recognition&#xFF0C; 2001&#xFF0C; I-511~I-518 </span></li>
<li><span id="2"> P. Viola, M. Jones. Robust real-time face detection[J]. International Journal of Computer Vision, 57(2), 2004, 137-154 </span></li>
<li><span id="3"> R. Xiao, L. Zhu, H. Zhang. Boosting Chain Learning for Object Detection[C], IEEE International Conference on Computer Vision, 2003, 709~715 </span></li>
<li><span id="4"> R. Lienhart, J. Maydt. An Extended Set of Haar-like Features for Rapid Object Detection[C], IEEE International Conference on Image Processing, 2002, I-900~I-903 </span></li>
<li><span id="5"> R. Lienhart, A. Kuranov, V. Pisarevsky. Empirical Analysis of Detection Cascades of Boosted Classifiers for Rapid Object Detection[C], Pattern Recognition, Springer, 2003, 297~304 </span></li>
<li><span id="6"> M. Jones, P. Viola. Fast multi-view face detection[C], IEEE Conference on Computer Vision and Pattern Recognition, 2003 </span></li>
<li><span id="7"> P. F. Felzenszwalb, D. P. Huttenlocher. Pictorial Structures for Object Recognition[J], International Journal of Computer Vision, Vol. 61, No. 1, 2005, 55~79 </span></li>
<li><span id="8"> P. F. Felzenszwalb, R. B. Girshick, D. McAllester, D. Ramanan. Object Detection with Discriminatively Trained Part-Based Models[J], IEEE Transactions on Pattern Analysis and Machine Intelligence, Vol. 32, No. 9, 2010, 1627~1645 </span></li>
<li><span id="9"> X. Zhu, D. Ramanan. Face detection, pose estimation, and landmark localization in the wild[C], IEEE Conference on Computer Vision and Pattern Recognition, 2012, 2879~2886 </span></li>
<li><span id="10"> X. Shen, Z. Lin, J. Brandt, Y. Wu. Detecting and Aligning Faces by Image Retrieval[C], IEEE Conference on Computer Vision and Pattern Recognition, 2013, 3460~3467 </span></li>
<li><span id="11"> H. Li, Z. Lin, J. Brandt, X. Shen, G. Hua. Efficient Boosted Exemplar-based Face Detection[C], IEEE Conference on Computer Vision and Pattern Recognition, 2014, 1843~1850 </span></li>
<li><span id="12"> A. Krizhevsky, I. Sutskever, G. E. Hinton. ImageNet Classification with Deep Convolutional Neural Networks[C], 2012, 1097~1105 </span></li>
<li><span id="13"> S. S. Farfade, M. Saberian, L. Li. Multi-view Face Detection Using Deep Convolutional Neural Networks[C], 5th ACM International Conference on Multimedia Retrieval, 2015, 643~650 </span></li>
<li><span id="14"> R. Girshick, J. Donahue, T. Darrell, J. Malik. Rich feature hierarchies for accurate object detection and semantic segmentation[C], IEEE Conference on Computer Vision and Pattern Recognition, 2014, 580~587 </span></li>
<li><span id="15"> N. Markus, M. Frljak, I. S. Pandzic, J. Ahlberg and R. Forchheimer. A Method for Object Detection Based on Pixel Intensity Comparisons Organized in Decision Trees[J], arXiv preprint arXiv:1305.4537, 2013 </span></li>
<li><span id="16"> L. Shengcai, A. K. Jain, and S. Z. Li. Unconstrained face detection, Technical report, Michigan State University, Dec.2012 </span></li>
<li><span id="17"> B. Yang, J. Yan, Z. Lei, S. Z. Li. Aggregate channel features for multi-view face detection[C], IEEE International Joint Conference on Biometrics, 2014, 1~8 </span></li>
<li><span id="18"> J. Li, Y. Zhang. Learning SURF Cascade for Fast and Accurate Object Detection[C], IEEE Conference on Computer Vision and Pattern Recognition, 2013, 3468~3475 </span></li>
<li><span id="19"> H. A. Rowley, S. Baluja, T. Kanade. Neural network-based face detection[C], IEEE Conference on Computer Vision and Pattern Recognition, 1996, 203~208 </span> </li>
<li><span id="20"> Y. Dauphin, R. Pascanu, C. Gulcehre, K. Cho, S. Ganguli, Y. Bengio. Identifying and attacking the saddle point problem in high-dimensional non-convex optimization[C], Neural Information Processing Systems, 2014, 2933~2941 </span></li>
<li><span id="21"> S. Liao, A. K. Jain, S. Z. Li. A Fast and Accurate Unconstrained Face Detector[J], IEEE Transactions on Pattern Analysis and Machine Intelligence, Vol. 38, No. 2, 2016, 211~223 </span></li>
<li><span id="22"> Y. Freund, R. E Schapire. A Decision-Theoretic Generalization of On-Line Learning and an Application to Boosting[J], Journal of computer and system sciences, Vol. 55, No. 1, 1997, 119~139 </span></li>
<li><span id="23"> J. Li, T. Wang, Y. Zhang. Face detection using SURF cascade[C], IEEE International Conference on Computer Vision, 2011, 2183~2190 </span></li>
<li><span id="24"> L. Bourdev, J. Brandt. Robust Object Detection Via Soft Cascade[C], IEEE Conference on Computer Vision and Pattern Recognition, 2005, 236~243 </span></li>
<li><span id="25"> H. Bay, A. Ess, T. Tuytelaars, L. Van Gool. Speeded-Up Robust Features (SURF)[J], Computer Vision and Image Understanding, Vol. 10, No. 3, 2008, 346~359 </span></li>
<li><span id="26"> J. Wu, N. Liu, C. Geyer, J. M. Rehg. C4 : A Real-Time Object Detection Framework[J], IEEE Transactions on Image Processing, Vol. 22, No. 10, 2013, 4096~4107 </span></li>
<li><span id="27"> T. Ojala, M. Pietik&#xE4;inen, D. Harwood. A comparative study of texture measures with classification based on featured distributions, Pattern Recognition, Vol. 29, No. 1, 1996, 51~59 </span></li>
<li><span id="28"> M. Mathias, R. Benenson, M. Pedersoli, L. Van Gool. Face detection without bells and whistles[C], European Conference on Computer Vision, 2014, 720~735 </span></li>
<li><span id="29"> P. Doll&#xE1;r1, Z. Tu, P. Perona, S. Belongie. Integral channel features[C], British Machine Vision Conference, 2009, 91.1~91.11 </span></li>
<li><span id="30"> N. Dalal, B. Triggs. Histograms of Oriented Gradients for Human Detection[C], IEEE Conference on Computer Vision and Pattern Recognition, 2005, 886~893 </span></li>
<li><span id="31"> P. Doll&#xE1;r, R. Appel, S. Belongie, P. Perona. Fast Feature Pyramids for Object Detection[J], IEEE Transactions on Pattern Analysis and Machine Intelligence, Vol. 36, No. 8, 2014, 1532~1545 </span></li>
<li><span id="32"> P. Viola, M. Jones. Fast and Robust Classification using Asymmetric AdaBoost and a Detector Cascade[C], Neural Information Processing Systems, 2002, 1311~1318 </span> </li>
<li><span id="33"> M. Saberian, N. Vasconcelos. Boosting Algorithms for Detector Cascade Learning[J], Journal of Machine Learning Research, Vol. 15, No. 1, 2014, 2569~2605 </span></li>
<li><span id="34"> P. Doll&#xE1;r, R. Appel, W. Kienzle. Crosstalk Cascades for Frame-Rate Pedestrian Detection[C], European Conference on Computer Vision, 2012, 645~659 </span></li>
<li><span id="35"> S. Ren, X. Cao, Y. Wei, J. Sun. Face Alignment at 3000 FPS via Regressing Local Binary Features[C], IEEE Conference on Computer Vision and Pattern Recognition, 2014, 1685~1692</span></li>
<li><span id="36"> X. Cao, Y. Wei, F. Wen, J. Sun. Face Alignment by Explicit Shape Regression[C], IEEE Conference on Computer Vision and Pattern Recognition, 2012, 2887~2894 </span></li>
<li><span id="37"> X. P. Burgos-Artizzu, P. Perona, P. Doll&#xE1;r. Robust face landmark estimation under occlusion[C], IEEE International Conference on Computer Vision, 2012, 1513~1520 </span></li>
<li><span id="38"> P. Doll&#xE1;r, P. Welinder, P. Perona. Cascaded Pose Regression[C], IEEE Conference on Computer Vision and Pattern Recognition, 2010, 1078~1085 </span></li>
<li><span id="39"> D. Chen, S. Ren, Y. Wei, X. Cao, J. Sun. Joint Cascade Face Detection and Alignment[C], European Conference on Computer Vision, 2014, 109~122 </span> </li>
<li><span id="40"> G. Ghiasi, C. C. Fowlkes. Occlusion Coherence: Detecting and Localizing Occluded Faces[J], arXiv preprint arXiv:1506.08347, 2015 </span></li>
<li><span id="41"> J. Yan, X. Zhang, Z. Lei, S. Z. Li. Face detection by structural models[J], Image and Vision Computing, Vol. 32, No. 10, 2014, 790~799 </span></li>
<li><span id="42"> J. Yan, Z. Lei, L. Wen, S. Z. Li. The Fastest Deformable Part Model for Object Detection[C], IEEE Conference on Computer Vision and Pattern Recognition, 2014, 2497~2504 </span></li>
<li><span id="43"> Y. LeCun, Y. Bengio, G. Hinton. Deep learning[J], Nature, Vol. 521, No. 7553, 2015, 436~444 </span></li>
<li><span id="44"> X. Glorot, A. Bordes, Y. Bengio. Deep Sparse Rectifier Neural Networks[J], Journal of Machine Learning Research[J], 2011, 315~323 </span></li>
<li><span id="45"> G. E. Hinton, N. Srivastava, A. Krizhevsky, I. Sutskever, R. R. Salakhutdinov. Improving neural networks by preventing co-adaptation of feature detectors[J], arXiv preprint arXiv:1207.0580, 2012 </span></li>
<li><span id="46"> R. Vaillant, C. Monrocq, Y. Le Cun. An original approach for the localization of objects in images[C], IEEE International Conference on Articial Neural Networks, 1993, 26~30 </span></li>
<li><span id="47"> R. Vaillant, C. Monrocq, Y. Le Cun. Original approach for the localisation of objects in images[J], Vision, Image and Signal Processing, Vol. 141, No. 4, 1994, 245~250 </span></li>
<li><span id="48"> H. A. Rowley, S. Baluja, T. Kanade. Neural network-based face detection[C], IEEE Conference on Computer Vision and Pattern Recognition, 1996, 203~208 </span></li>
<li><span id="49"> C. Garcia, M. Delakis. A Neural Architecture for Fast and Robust Face Detection[C], IEEE International Conference on Pattern Recognition, 2002, 44~47 </span></li>
<li><span id="50"> M. Delakis, C. Garcia. Training Convolutional Filters for Robust Face Detection[C], IEEE International Workshop of Neural Networks for Signal Processing, 2003, 739~748 </span></li>
<li><span id="51"> C. Garcia, M. Delakis. Convolutional face finder: a neural architecture for fast and robust face detection[J], IEEE Transactions on Pattern Analysis and Machine Intelligence, Vol. 26, No. 11, 2004, 1408~1423 </span></li>
<li><span id="52"> S. Roux, F. Mamalet, C. Garcia. Embedded Convolutional Face Finder[C], IEEE International Conference on Multimedia and Expo, 2006, 285~288 </span></li>
<li><span id="53"> M. Osadchy, Y. Le Cun, M. L. Miller. Synergistic Face Detection and Pose Estimation with Energy-Based Models[J], Journal of Machine Learning Research, Vol. 8, No. 1, 2007, 1017~1024 </span></li>
<li><span id="54"> B. Yang, J. Yan, Z. Lei, S. Z. Li. Convolutional channel features[C], IEEE International Conference on Computer Vision, 2015, 82~90 </span></li>
<li><span id="55"> H. Li, Z. Lin, X. Shen, J. Brandt, G. Hua. A convolutional neural network cascade for face detection[C], IEEE Conference on Computer Vision and Pattern Recognition, 2015, 5325~5334 </span></li>
<li><span id="56"> S. Yang, P. Luo, C. C. Loy, X. Tang. From facial parts responses to face detection: A deep learning approach[C], IEEE International Conference on Computer Vision, 2015, 3676~3684 </span></li>
</ol>
</content>
<summary type="html">
<blockquote>
<p>&#x505A;&#x4EBA;&#x8138;&#x68C0;&#x6D4B;&#x5DF2;&#x7ECF;&#x4E00;&#x6BB5;&#x65F6;&#x95F4;&#x4E86;&#xFF0C;&#x4E34;&#x8FD1;&#x6BD5;&#x4E1A;&#x60F3;&#x60F3;&#x5DE5;&#x4F5C;&#x540E;&#x4F30;&#x8BA1;&#x5E94;&#x8BE5;&#x4E0D;&#x4F1A;&#x6709;&#x592A;&#x591A;&#x65F6;&#x95F4;&#x518D;&#x6765;&#x641E;&#x8FD9;&#x4E2A;&#xFF0C;&#x4E0B;&#x9762;&#x62BD;&#x53D6;&#x4E86;&#x6BD5;&#x4E1A;&#x8BBA;&#x6587;&#x7684;&#x7B2C;&#x4E8C;&#x7AE0;&#x5BF9;&#x4EE5;&#x524D;&#x770B;&#x8FC7;&#x7684;&#x8BBA;&#x6587;&#x8FDB;&#x884C;&#x4E86;&#x603B;&#x7ED3;&#xFF0C;&#x5199;&#x6210;&#x4E86;&#x4E0B;&#x9762;&#x7684;&#x7EFC;&#x8FF0;&#xFF0C;&#x6DB5;&#x76D6;&#x5230;&#x6BD4;&#x8F83;&#x591A;&#x7684;&#x65B9;&#x6CD5;&#xFF0C;&#x5E0C;&#x671B;&#x5BF9;&#x770B;&#x5230;&#x8FD9;&#x7BC7;&#x6587;&#x7AE0;&#x7684;&#x7814;&#x7A76;&#x8005;&#x4F1A;&#x6709;&#x6240;&#x5E2E;&#x52A9;&#x3002;</p>
</blockquote>
</summary>
<category term="face detection" scheme="http://deyituo.github.io/categories/face-detection/"/>
<category term="face detection" scheme="http://deyituo.github.io/tags/face-detection/"/>
<category term="AI" scheme="http://deyituo.github.io/tags/AI/"/>
</entry>
</feed>