2016-08-09 20 views
1

私にはいくつかの説明が必要なダムコードがあります。C++:さまざまな静的および動的ポインタタイプを削除する

int main() { 
    int *ptr_i = new int[100]; 
    char *ptr_c = (char *)ptr_i; 
    delete [] ptr_c; 
    return 0; 
} 

まず第一に私がクラッシュするこのコードを期待していたが、それは私はこのケースではアロケータは、割り当てを解除するバイト数を追跡​​するので、あると信じているしませんでした。私もvalgrindをこのコードで実行しましたが、メモリリークはありません。 PODデータ型を扱う、どのように文字のc'torがintのそれとは異なりますとき場合

  1. : は、私は、次に関する説明が必要?

  2. コーディング規約とは別に、このコードではどのような問題がありますか?

+4

未定義の動作のように見えます...未定義の動作のように歩いています... – StoryTeller

+1

UBのように見えます。それらが非ポッド型の場合、デストラクタは決して呼び出されません。 – NathanOliver

+0

"このコードでは他にどのような問題が発生する可能性がありますか。これは未定義の振る舞いの性質です。この質問は広すぎます。真剣に、それはあなたの実際の質問が何であるかは不明です。あなたはコードが間違っていることを知っているので( "ダム")、何を求めているのですか?とにかくそれはなぜ働くのですか?誰が知っているかは、実装に依存しており、推測するのに十分な情報を私たちに与えるわけではありません。なぜ答えが役に立つのか?このようなコードを書くべきではありません。 –

答えて

5

intため、またcharにはコンストラクタがありません。ただし、オペレータdelete(正確にはdelete [])の使用がオペレータnewnew [])の使用と一致しないため、動作は未定義です。

未定義の動作は、クラッシュが発生することを意味しません。これは、メモリリークが発生することを意味しません。

これは単に、C++標準が何が起こるかに制限を設けていないことを意味しています。

クラッシュが発生する場合もありません。メモリリークが発生する場合もありません。コンパイラは、ハードドライブを再フォーマットすることも、フォーマットしないこともあります。あなたのプログラムは、42の値を合計で27回印刷することもあれば、印刷しないこともあります。あなたが想像することができます発生するかもしれないし、発生しない可能性があります。

そのようなコードが原因で発生する可能性がある問題は、....何か...または何もない可能性があります。最大の問題は、あなたが必ずしも知ることができないということです。

+1

delete []呼び出しがプログラムの最後のものであるため、ヒープの破損やその他のUBの結果が最悪の場合でも、観察することは非常に困難です。 –

+0

@Lorenzo - はい、* UBが 'return 0;'のように 'system("形式C: ");' –

関連する問題