teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

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

2019/12/08 16:18

投稿

Bearded-Ockham
Bearded-Ockham

スコア430

answer CHANGED
@@ -1,9 +1,33 @@
1
1
  > 1. numの寿命はforブロック内で終わるが、この記述に問題はないか
2
2
 
3
- 大問題です。`num`は、`for`の繰り返しごとに生成され、その繰り返しが終わったら廃棄されます。つまり`i==0`のとき、`num`が生成され、`i==0`の繰り返しが終わるときに廃棄され、`i==1`の時にまた生成され...となります。廃棄された変数のアドレスを参照するのは未定義の動作なので、たとえばろに`i==0`のあと`i==1`の時にプログラムがクラッシュしても「C++の仕様だから」の一言で済ませられることです。
3
+ 大問題です。`num`は、`for`の繰り返しごとに生成され、その繰り返しが終わったら廃棄されます。つまり`i==0`のとき、`num`が生成され、`i==0`の繰り返しが終わるときに廃棄され、`i==1`の時にまた生成され...となります。廃棄された変数のアドレスを参照するのは未定義の動作なので、たとえば`i==0`のあと`i==1`の時にプログラムがクラッシュしても「C++の仕様だから」の一言で済ませられることです。
4
4
 
5
5
  実際に起きているのは、`num`が都度廃棄されてメモリが空くので、そのメモリを再利用して新たな`num`を生成しているのでしょう。
6
6
 
7
7
  > numをそれぞれ別のアドレスに定義し、tの寿命までこれを保持する方法はあるか
8
8
 
9
- `int`型のメモリを確保する必要があります。生の`new`を使うと、`pop`するたびに自分で`delete`しなければならないので、`std::unique_ptr`か`std::shared_ptr`を使うのが普通でしょう。
9
+ `int`型のメモリを確保する必要があります。生の`new`を使うと、`pop`するたびに自分で`delete`しなければならないので、`std::unique_ptr`か`std::shared_ptr`を使うのが普通でしょう。
10
+
11
+ `unique_ptr`を使った時のサンプルは
12
+
13
+ ```C++
14
+ #include <iostream>
15
+ #include <stack>
16
+ #include <memory>
17
+ using namespace std;
18
+
19
+ int main() {
20
+ stack<unique_ptr<int> > t;
21
+
22
+ for (int i = 0; i < 10; i++) {
23
+ auto pnum{ make_unique<int>(i) };
24
+ t.push(std::move(pnum));
25
+ }
26
+ while (!t.empty()) {
27
+ cout << *t.top() << endl;
28
+ t.pop();
29
+ }
30
+
31
+ return 0;
32
+ }
33
+ ```