回答編集履歴

1

回答修正

2016/01/21 04:10

投稿

Chironian
Chironian

スコア23272

test CHANGED
@@ -7,6 +7,28 @@
7
7
  しかし、一点間違いがあるので、もしかするとそれが原因でTAKAYUKI_MIWAさんの環境では例外になるのかも知れません。
8
8
 
9
9
  Worker::nameは、コンストラクタでnew char[80];とnew[]演算子で確保してますので、解放もdelete[]を使う必要が有ります。`delete name;`ではなく、`delete[] name;`としてみてください。
10
+
11
+
12
+
13
+ ---
14
+
15
+ 【追記】
16
+
17
+ hskさんのご指摘で気が付きました。
18
+
19
+ delete[]へ変更しても、落ちそうです。
20
+
21
+ コンパイラが自動生成するコピーコンストラクタにて、w1のnameのポインタ値がそのままShowData()のw2のnameへコピーされます。これは、デフォルトコンストラクタでnewされたものと同じものを指してます。
22
+
23
+ そして、ShowData()の終了時にw2がデストラクトされる時にdelete[]され、次にmain()の終了時にw1のデストラクト時に再度delete[]されるため、多重解放で落ちる可能性もあります。
24
+
25
+
26
+
27
+ MinGWではこの場合も落ちないようですが、msvcでは落ちました。
28
+
29
+ 恐らく多重解放は「未定義」な動作なのだと思います。処理系の実装に任せられていて、落ちても良し、何もしなくても良し、はたまた別の動作でも良しと規定されているのではないかと思います。
30
+
31
+ C/C++には結構多いです。高速性のための対価なのです。
10
32
 
11
33
 
12
34