回答編集履歴

1

タイポ修正およびサンプルコードの追加

2019/12/08 16:18

投稿

Bearded-Ockham
Bearded-Ockham

スコア430

test CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
 
4
4
 
5
- 大問題です。`num`は、`for`の繰り返しごとに生成され、その繰り返しが終わったら廃棄されます。つまり`i==0`のとき、`num`が生成され、`i==0`の繰り返しが終わるときに廃棄され、`i==1`の時にまた生成され...となります。廃棄された変数のアドレスを参照するのは未定義の動作なので、たとえばろに`i==0`のあと`i==1`の時にプログラムがクラッシュしても「C++の仕様だから」の一言で済ませられることです。
5
+ 大問題です。`num`は、`for`の繰り返しごとに生成され、その繰り返しが終わったら廃棄されます。つまり`i==0`のとき、`num`が生成され、`i==0`の繰り返しが終わるときに廃棄され、`i==1`の時にまた生成され...となります。廃棄された変数のアドレスを参照するのは未定義の動作なので、たとえば`i==0`のあと`i==1`の時にプログラムがクラッシュしても「C++の仕様だから」の一言で済ませられることです。
6
6
 
7
7
 
8
8
 
@@ -15,3 +15,51 @@
15
15
 
16
16
 
17
17
  `int`型のメモリを確保する必要があります。生の`new`を使うと、`pop`するたびに自分で`delete`しなければならないので、`std::unique_ptr`か`std::shared_ptr`を使うのが普通でしょう。
18
+
19
+
20
+
21
+ `unique_ptr`を使った時のサンプルは
22
+
23
+
24
+
25
+ ```C++
26
+
27
+ #include <iostream>
28
+
29
+ #include <stack>
30
+
31
+ #include <memory>
32
+
33
+ using namespace std;
34
+
35
+
36
+
37
+ int main() {
38
+
39
+ stack<unique_ptr<int> > t;
40
+
41
+
42
+
43
+ for (int i = 0; i < 10; i++) {
44
+
45
+ auto pnum{ make_unique<int>(i) };
46
+
47
+ t.push(std::move(pnum));
48
+
49
+ }
50
+
51
+ while (!t.empty()) {
52
+
53
+ cout << *t.top() << endl;
54
+
55
+ t.pop();
56
+
57
+ }
58
+
59
+
60
+
61
+ return 0;
62
+
63
+ }
64
+
65
+ ```