タイムマシーンがあったら、過去と未来どちらに行く?

deleteでメモリ開放するとエラーになる原因がわからないです。

下記のようなプログラムを作ったのですが、deleteのところでエラーがでます。
エラー内容は
「Windows によって ****.exe でブレークポイントが発生しました。
ヒープが壊れていることが原因として考えられます。****.exe または読み込まれた DLL にバグがあります。
あるいは、****.exe がフォーカスを持っているときに、ユーザーが F12 キーを押したことが原因として考えられます。
可能であれば、出力ウィンドウに詳細な診断情報が表示されます。」
とでます。

ソースは
wchar_t *aaa = L"ほげほげ";
wchar_t bbb[200];

wcscpy(bbb, aaa);

delete aaa;

wprintf(L"%s\n", bbb);

getchar();
です。

どこに原因があるのでしょうか?

[環境]
WindowsXP+VisualC++2008 UNICODE使用

A 回答 (5件)

メモリを動的に取ったした時は、決まったやり方で解放します。


メモリを確保するにはC++では「new」、C言語では「new」が一般的です。
「new」で取ったメモリは「delete」で解放する、「malloc」は「free」を使う、というのも決まりです。(「new」で取ったメモリを「free」で解放するとエラーになります。「malloc」も同じ)

サンプルのコードでは、「new」で取っていないメモリ領域に対して「delete」をかけてしまっているのがエラーの原因です。
コンパイルを通すだけなら「delete」の部分を削除すればよいかと思います。

「new」と「delete」はC++をやる限り理解しなければならない命令文です。ここの理解がいい加減だと、C++では地獄を見ます。
できれば「C++ new delete」で検索をかけて、詳細を調べることをお勧めします。
    • good
    • 0

>文字列定数をdeleteで解放


文字定数に限らず、newしていない領域に対して
deleteしてはいけません。
この2つはセットだと思ってください。

>どこに原因があるのでしょうか?
delete aaa;←ここ
    • good
    • 0

★アドバイス


・文字列定数をdeleteで解放できますか?
 →出来ません。
 よってエラーになります。
    • good
    • 0

そう、deleteが原因です。

    • good
    • 0

new してないんだから delete しちゃいかんです。

    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


おすすめ情報

このQ&Aを見た人がよく見るQ&A