• ベストアンサー

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

kameyagogoの回答

  • ベストアンサー
回答No.5

メモリを動的に取ったした時は、決まったやり方で解放します。 メモリを確保するにはC++では「new」、C言語では「new」が一般的です。 「new」で取ったメモリは「delete」で解放する、「malloc」は「free」を使う、というのも決まりです。(「new」で取ったメモリを「free」で解放するとエラーになります。「malloc」も同じ) サンプルのコードでは、「new」で取っていないメモリ領域に対して「delete」をかけてしまっているのがエラーの原因です。 コンパイルを通すだけなら「delete」の部分を削除すればよいかと思います。 「new」と「delete」はC++をやる限り理解しなければならない命令文です。ここの理解がいい加減だと、C++では地獄を見ます。 できれば「C++ new delete」で検索をかけて、詳細を調べることをお勧めします。

関連するQ&A

  • ワイド文字(列)について

    ワイド文字(列)について質問です。 printf()などより、wprintf()などのワイド文字を扱える関数を 使おうと思っているのですが、うまく表示されません。 何が原因なのでしょうか? ソースです。 #include <stdio.h> int main(void) { wchar_t *data = L"かきくけこ"; wprintf(L"あいうえお\n"); wprintf(L"%s\n", data); return (0); } wprintf(L"%s\n", data);は表示はされるのですが、 「?」になります。 環境 XP Visual Studio 2005

  • wsprintfのエラーについて

    Visual C++を使ってC++,Win32APIでプログラムしています。 ウィンドウ上に変数の値を表示したいのですが、うまくできません。 wsprintfを使うと以下のようなエラーがでてしまいます。 1>time.obj : error LNK2020: 未解決のトークン (0A000015) "extern "C" int __cdecl wsprintfW(wchar_t *,wchar_t const *,...)" (?wsprintfW@@$$J0YAHPA_WPB_WZZ) 1>time.obj : error LNK2020: 未解決のトークン (0A000016) "extern "C" int __cdecl wsprintfW(wchar_t *,wchar_t const *,...)" (?wsprintfW@@$$J0YAHPA_WPB_WZZ) 1>time.obj : error LNK2001: 外部シンボル ""extern "C" int __cdecl wsprintfW(wchar_t *,wchar_t const *,...)" (?wsprintfW@@$$J0YAHPA_WPB_WZZ)" は未解決です。 1>C:\Documents and Settings\home\My Documents\Visual Studio 2005\Projects\time\Debug\time.exe : fatal error LNK1120: 外部参照 3 が未解決です。 どのようにすればよいのでしょうか?または、他のやり方があるのでしょうか? お願いします。

  • 文字のバイト数を数えるには

    なんか一日一問になってしまったのですが、、 よろしくお願いします。 wchar_t 型に入っている文字のバイト数を数えるにはどうしたら良いでしょうか? L"あいう123" のような文字の場合UNICODEの場合12バイトですが、 全角半角区別して9バイトを求めたいです。 UNICODE環境では不可能でしょうか?

  • VisualC++6.0でdeleteがおかしい

    今頃ですが、VisualC++6.0を使っています。とりあえずはこれで十分なので。で、WindowXPです。 1つのMFCAppWizardメインプロジェクトに対して、3つのライブラリ専用のサブプロジェクトを統合してプログラムを作っていますが、下記の簡単なdeleteもなぜか、出来なくなりました。 long* p; p = new long; delete p; 実行するとdelete pのところで、 NTDLL! 7c9668ad() PRONAME! free + 45 bytes PRONAME! operator delete(void *) + 9 bytes PRONAMEDlg::OnBtnCapturepicture() line 267 + 15 bytes のようなエラーが出てきます(デバッグモード)。 ちょっと気になったのが、最近、VirusBusterをインストールしましたので、実行後に、 'C:\Program Files\Trend Micro\Virus Buster 2007\TMAS_OE\TMAS_OEHook.dll' をロードしました、合致するシンボル情報は見つかりませんでした。 などというコメントが出てくるようになりました。 しかし、ちなみに全く新しいMFCAppWizardテストプロジェクトを作って、他のプロジェクトとリンク等、いっさいせずに簡単なもので動かすと、上記のコード、全く問題なく動きます。 この delete のエラーって、何が原因なのでしょうか。 考えられることがおわかりであれば、教えてください。

  • エラーの原因が・・・

    ただいまVisualC++を使ってプログラミング中なのですが、エラーの原因が分からず困っています。 デバッグ開始(緑色のボタンをクリック)して以下のような状態になります。 エラーメッセージは「test.exe の 0x1029e9ee でハンドルされていない例外が発生しました: 0xC0000005: 場所 0xcdcdcdcd を読み込み中にアクセス違反が発生しました。」です。 エラーが出ているのは逆アセンブルのところで、main関数の終わり(}のところ)からステップインをしていった途中の「movsx ecx,byte ptr [eax]」の文でエラーが発生していることが分かりました。 この文はソースのどの部分に対応しているか分からず、困っています。 いつもは配列の添字が要素数を超えていたりするのですが、エラーの場所が場所なので原因が分かりません。 ソースコードは分割が多く、どこを載せていいのかさっぱりです。 情報が少ないので、必要な情報などありましたら言ってください。

  • 文字列を特定の全角文字で区切る方法

    文字列を特定の全角文字で区切る方法 C言語で、文字列を特定の全角文字で区切って画面に出力する操作をしたいのですが、うまくいきません。 #include <wchar.h> int main(void) {   wchar_t name[] = L"シーゲンゴ・タロウ";   wchar_t *p;   wchar_t delim[] = L"・";   wprintf(L"%ws\n", name);   p = wcstok(name, delim);   putws(p);   while (p!=NULL) {     p = wcstok(NULL, delim);     if (p!=NULL) {       putws(p);     }   } } 上記のコードを実行すると、出力が シーゲンゴ・タロウ シ [ゲンゴ タロ・ となってしまい、何故か"ー"と"ウ"まで反応して別の文字になります。 今までwchar.hを使ったことが無かったので、やり方が不味い所を教えて下さい。 よろしくお願いします。

  • ハンドルされていない例外が発生?

    C++にて作成したアプリを終了すると0xC0000005エラーが発生します。 エラー箇所は AAA *aaa //AAAは外部クラス(グローバル) void BBB{ aaaa = new aaa; aaa->ccc();} void CCC{ aaa->ddd(); delete aaaa; } メイン関数にてBBB→CCCの順で数回読んでいます。 エラーの原因として何が考えられるでしょうか? 開発環境はWindowsXP VC++6.0です。 よろしくお願いします。

  • クリップボードへのコピー

    あるHPのコードを参考に文字をクリップボードへ コピーするコードを書いてみましたが、エラーが できます。なにかおかしいかご指摘いただけないでしょうか? HGLOBAL hText; wchar_t *pText; hText = GlobalAlloc(GMEM_DDESHARE | GMEM_MOVEABLE, 4); pText = (wchar_t*)GlobalLock(hText); lstrcpy(pText, L"abc"); GlobalUnlock(hText); OpenClipboard(NULL); EmptyClipboard(); SetClipboardData(CF_TEXT, hText);//ここでヒープが壊れていると起こられます。 CloseClipboard(); もっとも単純なテストコードです。 いろいろとチェックを手抜きしてますが、とりあえずOKとします。

  • アンマネージドC++のDLLを使うと、wchar_t型のみビルドエラー

    アンマネージドC++のDLLを使うと、wchar_t型のみビルドエラー アンマネージドのC++(VC++6.0)で作成したDLLを、マネージドのC++(VisualStudio2008)で利用したいと考えています。 しかし、DLL中の関数のうち、wchar_t型を返す関数のみビルドが通らずにerror LNK2028が表示されます。 試しに、アンマネージドのC++プロジェクトからこのDLLを利用したところ、問題なくビルドが通りました。 何かマネージドのプロジェクトに必要な設定が抜けているのでしょうか。 (DLLは_UNICODEを指定しています。) それぞれ、以下のように記述しています。 よろしくお願いいたします。 // アンマネージドC++ (テスト用ですので、関数内の処理は正確なものではありません) class DLL_EXPORT MyClass { public: char CharTest(); wchar_t WCharTest(); }; char MyClass::CharTest() { char c = 'a'; return c; } wchar_t MyClass::WCharTest() { wchar_t wc = L'a'; return wc; } // マネージドC++ int main(array<System::String ^> ^args) { MyClass *p = new MyClass(); p->CharTest(); // OK p->WCharTest(); // ビルドエラー return 0; } // エラー内容 エラー 1 error LNK2028: 未解決のトークン (0A000008) "public: wchar_t __thiscall MyClass::WCharTest(void)" (?WCharTest@MyClass@@$$FQAE_WXZ) が関数 "int __clrcall main(cli::array<class System::String ^ >^)" (?main@@$$HYMHP$01AP$AAVString@System@@@Z) で参照されました。 UnManagedDLLUserFromManaged.obj UnManagedDLLUserFromManaged

  • SQL、2つのテーブルで条件一致したものだけdeleteする方法は?

    オラクルSQLで質問です やりたいことは、 テーブルAから以下の条件に該当するデータを削除する。 基本的にはテーブルBの内容と比較して、一致したもの。 条件(全ての条件を満たすこと)  テーブルA.AAA = テーブルB.AAA  テーブルA.BBB = テーブルB.BBB  テーブルB.CCC > 0 調べたところ、SQLサーバでは以下のように from を2つ書いて実現できるようです。 が、今回はオラクルなので文法エラーになります。 delete FROM テーブルA FROM テーブルB where テーブルA.AAA = テーブルB.AAA AND テーブルA.BBB = テーブルB.BBB AND テーブルA.CCC > 0 ; commit; よろしくお願いします