68
68
69
69
</ head >
70
70
< body >
71
- < header data-kunai-mdinfo ="{"meta": {"header": ["memory"], "namespace": ["std"], "class": ["unique_ptr"], "id-type": ["function"], "cpp": ["cpp11"]}, "sources": [{"id": "3547e3ebf875d18f8de266f4bab7fc855acc689a", "source": "#include <cassert>\n#include <memory>\n\nint main()\n{\n // (1) \u30c7\u30d5\u30a9\u30eb\u30c8\u69cb\u7bc9\n // \u6240\u6709\u6a29\u3092\u6301\u305f\u306a\u3044\u3001\u7a7a\u306eunique_ptr\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u3092\u69cb\u7bc9\u3059\u308b\n std::unique_ptr<int> p1;\n assert(!p1);\n\n // (2) \u751f\u30dd\u30a4\u30f3\u30bf\u304b\u3089\u6240\u6709\u6a29\u3092\u8b72\u6e21\u3057\u3066\u69cb\u7bc9\n std::unique_ptr<int> p2(new int(3));\n assert(p2);\n\n // (3), (4) \u751f\u30dd\u30a4\u30f3\u30bf\u304b\u3089\u6240\u6709\u6a29\u3092\u8b72\u6e21\u3057\u3001\u30c7\u30ea\u30fc\u30bf\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u3068\u3068\u3082\u306b\u69cb\u7bc9\n std::unique_ptr<int> p3(new int(3), std::default_delete<int>());\n assert(p3);\n\n // (5) \u4ed6\u306eunique_ptr\u304b\u3089\u6240\u6709\u6a29\u3092\u8b72\u6e21\u3059\u308b\n std::unique_ptr<int> p5 = std::move(p3);\n assert(*p5 == 3);\n\n // (6) nullptr\u3067\u69cb\u7bc9\n // \u30c7\u30d5\u30a9\u30eb\u30c8\u30b3\u30f3\u30b9\u30c8\u30e9\u30af\u30bf(1)\u3068\u540c\u3058\n std::unique_ptr<int> p6 = nullptr;\n assert(!p6);\n\n // (7) \u5909\u63db\u53ef\u80fd\u306a\u4ed6\u306eunique_ptr\u304b\u3089\u6240\u6709\u6a29\u3092\u8b72\u6e21\u3059\u308b\n std::unique_ptr<const int> p7 = std::move(p5);\n assert(*static_cast<const int*>(p7.get()) == 3);\n}\n"}], "page_id": ["reference", "memory", "unique_ptr", "op_constructor"]} ">
71
+ < header data-kunai-mdinfo ="{"meta": {"header": ["memory"], "namespace": ["std"], "class": ["unique_ptr"], "id-type": ["function"], "cpp": ["cpp11"]}, "sources": [{"id": "09049231575567a450967337a28b67e2e949e857", "source": "#include <cassert>\n#include <memory>\n\nusing AllocTraits = std::allocator_traits<std::allocator<int>>;\n\nclass Deleter {\n public:\n explicit Deleter(const std::allocator<int>& alloc) : alloc_(alloc) {}\n\n void operator()(int* p) {\n AllocTraits::destroy(alloc_, p);\n AllocTraits::deallocate(alloc_, p, 1);\n }\n private:\n std::allocator<int> alloc_;\n};\n\nint main()\n{\n // (1) \u30c7\u30d5\u30a9\u30eb\u30c8\u69cb\u7bc9\n // \u6240\u6709\u6a29\u3092\u6301\u305f\u306a\u3044\u3001\u7a7a\u306eunique_ptr\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u3092\u69cb\u7bc9\u3059\u308b\n std::unique_ptr<int> p1;\n assert(!p1);\n\n // (2) \u751f\u30dd\u30a4\u30f3\u30bf\u304b\u3089\u6240\u6709\u6a29\u3092\u8b72\u6e21\u3057\u3066\u69cb\u7bc9\n std::unique_ptr<int> p2(new int(3));\n assert(p2);\n\n // (3), (4) \u751f\u30dd\u30a4\u30f3\u30bf\u304b\u3089\u6240\u6709\u6a29\u3092\u8b72\u6e21\u3057\u3001\u30c7\u30ea\u30fc\u30bf\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u3068\u3068\u3082\u306b\u69cb\u7bc9\n std::unique_ptr<int> p3(new int(3), std::default_delete<int>());\n assert(p3);\n\n // \u81ea\u4f5c\u30c7\u30ea\u30fc\u30bf\u3092\u4f7f\u3063\u305f\u4f8b\n {\n std::allocator<int> alloc;\n int* p = AllocTraits::allocate(alloc, 1);\n AllocTraits::construct(alloc, p, 4);\n std::unique_ptr<int, Deleter> p4(p, Deleter(alloc));\n assert(p4);\n assert(*p4 == 4);\n }\n\n // (5) \u4ed6\u306eunique_ptr\u304b\u3089\u6240\u6709\u6a29\u3092\u8b72\u6e21\u3059\u308b\n std::unique_ptr<int> p5 = std::move(p3);\n assert(*p5 == 3);\n\n // (6) nullptr\u3067\u69cb\u7bc9\n // \u30c7\u30d5\u30a9\u30eb\u30c8\u30b3\u30f3\u30b9\u30c8\u30e9\u30af\u30bf(1)\u3068\u540c\u3058\n std::unique_ptr<int> p6 = nullptr;\n assert(!p6);\n\n // (7) \u5909\u63db\u53ef\u80fd\u306a\u4ed6\u306eunique_ptr\u304b\u3089\u6240\u6709\u6a29\u3092\u8b72\u6e21\u3059\u308b\n std::unique_ptr<const int> p7 = std::move(p5);\n assert(*static_cast<const int*>(p7.get()) == 3);\n}\n"}], "page_id": ["reference", "memory", "unique_ptr", "op_constructor"]} ">
72
72
< nav class ="navbar navbar-default " role ="navigation ">
73
73
< div class ="container-fluid ">
74
74
< div class ="navbar-header ">
200
200
201
201
< p class ="text-right "> < small >
202
202
最終更新日時(UTC):
203
- < span itemprop ="datePublished " content ="2024-06-11T13:45:38 ">
204
- 2024年06月11日 13時45分38秒
203
+ < span itemprop ="datePublished " content ="2024-07-17T08:21:31 ">
204
+ 2024年07月17日 08時21分31秒
205
205
</ span >
206
206
< br />
207
207
< span itemprop ="author " itemscope itemtype ="http://schema.org/Person ">
208
- < span itemprop ="name "> Akira Takahashi </ span >
208
+ < span itemprop ="name "> Yuya Asano </ span >
209
209
</ span >
210
210
が更新
211
211
</ small > </ p >
@@ -339,9 +339,23 @@ <h2>備考</h2>
339
339
</ code > </ pre > </ div >
340
340
</ p >
341
341
< h2 > 例</ h2 >
342
- < p > < div class ="yata " id ="3547e3ebf875d18f8de266f4bab7fc855acc689a "> < div class ="codehilite "> < pre > < span > </ span > < code > < span class ="cp "> #include</ span > < span class ="cpf "> < a href ="../../cassert.html "> <cassert></ a > </ span > < span class ="cp "> </ span >
342
+ < p > < div class ="yata " id ="09049231575567a450967337a28b67e2e949e857 "> < div class ="codehilite "> < pre > < span > </ span > < code > < span class ="cp "> #include</ span > < span class ="cpf "> < a href ="../../cassert.html "> <cassert></ a > </ span > < span class ="cp "> </ span >
343
343
< span class ="cp "> #include</ span > < span class ="cpf "> < a href ="../../memory.html "> <memory></ a > </ span > < span class ="cp "> </ span >
344
344
345
+ < span class ="k "> using</ span > < span class ="n "> AllocTraits</ span > < span class ="o "> =</ span > < span class ="n "> < a href ="../allocator_traits.html "> std::allocator_traits</ a > </ span > < span class ="o "> <</ span > < span class ="n "> < a href ="../allocator.html "> std::allocator</ a > </ span > < span class ="o "> <</ span > < span class ="kt "> int</ span > < span class ="o "> >></ span > < span class ="p "> ;</ span >
346
+
347
+ < span class ="k "> class</ span > < span class ="nc "> Deleter</ span > < span class ="p "> {</ span >
348
+ < span class ="k "> public</ span > < span class ="o "> :</ span >
349
+ < span class ="k "> explicit</ span > < span class ="n "> Deleter</ span > < span class ="p "> (</ span > < span class ="k "> const</ span > < span class ="n "> < a href ="../allocator.html "> std::allocator</ a > </ span > < span class ="o "> <</ span > < span class ="kt "> int</ span > < span class ="o "> >&</ span > < span class ="n "> alloc</ span > < span class ="p "> )</ span > < span class ="o "> :</ span > < span class ="n "> alloc_</ span > < span class ="p "> (</ span > < span class ="n "> alloc</ span > < span class ="p "> )</ span > < span class ="p "> {}</ span >
350
+
351
+ < span class ="kt "> void</ span > < span class ="k "> operator</ span > < span class ="p "> ()(</ span > < span class ="kt "> int</ span > < span class ="o "> *</ span > < span class ="n "> p</ span > < span class ="p "> )</ span > < span class ="p "> {</ span >
352
+ < span class ="n "> AllocTraits</ span > < span class ="o "> ::</ span > < span class ="n "> < a href ="../allocator_traits/destroy.html "> destroy</ a > </ span > < span class ="p "> (</ span > < span class ="n "> alloc_</ span > < span class ="p "> ,</ span > < span class ="n "> p</ span > < span class ="p "> );</ span >
353
+ < span class ="n "> AllocTraits</ span > < span class ="o "> ::</ span > < span class ="n "> < a href ="../allocator_traits/deallocate.html "> deallocate</ a > </ span > < span class ="p "> (</ span > < span class ="n "> alloc_</ span > < span class ="p "> ,</ span > < span class ="n "> p</ span > < span class ="p "> ,</ span > < span class ="mi "> 1</ span > < span class ="p "> );</ span >
354
+ < span class ="p "> }</ span >
355
+ < span class ="k "> private</ span > < span class ="o "> :</ span >
356
+ < span class ="n "> < a href ="../allocator.html "> std::allocator</ a > </ span > < span class ="o "> <</ span > < span class ="kt "> int</ span > < span class ="o "> ></ span > < span class ="n "> alloc_</ span > < span class ="p "> ;</ span >
357
+ < span class ="p "> };</ span >
358
+
345
359
< span class ="kt "> int</ span > < span class ="nf "> main</ span > < span class ="p "> ()</ span >
346
360
< span class ="p "> {</ span >
347
361
< span class ="c1 "> // (1) デフォルト構築</ span >
@@ -357,6 +371,16 @@ <h2>例</h2>
357
371
< span class ="n "> < a href ="../unique_ptr.html "> std::unique_ptr</ a > </ span > < span class ="o "> <</ span > < span class ="kt "> int</ span > < span class ="o "> ></ span > < span class ="n "> p3</ span > < span class ="p "> (</ span > < span class ="k "> new</ span > < span class ="kt "> int</ span > < span class ="p "> (</ span > < span class ="mi "> 3</ span > < span class ="p "> ),</ span > < span class ="n "> < a href ="../default_delete.html "> std::default_delete</ a > </ span > < span class ="o "> <</ span > < span class ="kt "> int</ span > < span class ="o "> ></ span > < span class ="p "> ());</ span >
358
372
< span class ="n "> < a href ="../../cassert/assert.html "> assert</ a > </ span > < span class ="p "> (</ span > < span class ="n "> p3</ span > < span class ="p "> );</ span >
359
373
374
+ < span class ="c1 "> // 自作デリータを使った例</ span >
375
+ < span class ="p "> {</ span >
376
+ < span class ="n "> < a href ="../allocator.html "> std::allocator</ a > </ span > < span class ="o "> <</ span > < span class ="kt "> int</ span > < span class ="o "> ></ span > < span class ="n "> alloc</ span > < span class ="p "> ;</ span >
377
+ < span class ="kt "> int</ span > < span class ="o "> *</ span > < span class ="n "> p</ span > < span class ="o "> =</ span > < span class ="n "> AllocTraits</ span > < span class ="o "> ::</ span > < span class ="n "> < a href ="../allocator_traits/allocate.html "> allocate</ a > </ span > < span class ="p "> (</ span > < span class ="n "> alloc</ span > < span class ="p "> ,</ span > < span class ="mi "> 1</ span > < span class ="p "> );</ span >
378
+ < span class ="n "> AllocTraits</ span > < span class ="o "> ::</ span > < span class ="n "> < a href ="../allocator_traits/construct.html "> construct</ a > </ span > < span class ="p "> (</ span > < span class ="n "> alloc</ span > < span class ="p "> ,</ span > < span class ="n "> p</ span > < span class ="p "> ,</ span > < span class ="mi "> 4</ span > < span class ="p "> );</ span >
379
+ < span class ="n "> < a href ="../unique_ptr.html "> std::unique_ptr</ a > </ span > < span class ="o "> <</ span > < span class ="kt "> int</ span > < span class ="p "> ,</ span > < span class ="n "> Deleter</ span > < span class ="o "> ></ span > < span class ="n "> p4</ span > < span class ="p "> (</ span > < span class ="n "> p</ span > < span class ="p "> ,</ span > < span class ="n "> Deleter</ span > < span class ="p "> (</ span > < span class ="n "> alloc</ span > < span class ="p "> ));</ span >
380
+ < span class ="n "> < a href ="../../cassert/assert.html "> assert</ a > </ span > < span class ="p "> (</ span > < span class ="n "> p4</ span > < span class ="p "> );</ span >
381
+ < span class ="n "> < a href ="../../cassert/assert.html "> assert</ a > </ span > < span class ="p "> (</ span > < span class ="o "> *</ span > < span class ="n "> p4</ span > < span class ="o "> ==</ span > < span class ="mi "> 4</ span > < span class ="p "> );</ span >
382
+ < span class ="p "> }</ span >
383
+
360
384
< span class ="c1 "> // (5) 他のunique_ptrから所有権を譲渡する</ span >
361
385
< span class ="n "> < a href ="../unique_ptr.html "> std::unique_ptr</ a > </ span > < span class ="o "> <</ span > < span class ="kt "> int</ span > < span class ="o "> ></ span > < span class ="n "> p5</ span > < span class ="o "> =</ span > < span class ="n "> < a href ="../../utility/move.html "> std::move</ a > </ span > < span class ="p "> (</ span > < span class ="n "> p3</ span > < span class ="p "> );</ span >
362
386
< span class ="n "> < a href ="../../cassert/assert.html "> assert</ a > </ span > < span class ="p "> (</ span > < span class ="o "> *</ span > < span class ="n "> p5</ span > < span class ="o "> ==</ span > < span class ="mi "> 3</ span > < span class ="p "> );</ span >
0 commit comments