• ベストアンサー

_dupenv_s関数でメモリリーク

VC++2005のMFCにてアプリを作成しています。 環境変数「TEST_ENV」の値を「OFF」にあらかじめ設定し、 _dupenv_s()関数にて変数の値を読込むプログラムなのですが、 プログラムをデバッグモードで実行し出力欄を見ると、 「Detected memory leaks!」と表示され、 原因箇所を探ると、どうやら ============================================== char* pGetEnv; size_t len; _dupenv_s( &pGetEnv, &len, "TEST_ENV" );←ここ ============================================== にて発生しているようです。 MSDNによると、lenにはバッファ容量を指定とあるので、 原因として、lenに何も指定されておらず、リークが発生していると考え、 Webで方法を色々調べたのですが、どのサイトも同じような書き方で、 解決法が分かりません。 どなたかご存知の方おられましたら、ご教授お願い致します。 なお下記にメッセージログを記載します。 Detected memory leaks! Dumping objects -> {73} normal block at 0x003A7018, 4 bytes long. Data: <OFF > 4F 46 46 00

質問者が選んだベストアンサー

  • ベストアンサー
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

_dupenv_sが0を返したかどうかをチェックして 関数が成功した『0』を返してきたのであれば確保されたpGetEnvが 用済みになって時点でfreeなどで開放しましょう

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

  • php504
  • ベストアンサー率42% (926/2160)
回答No.3

dummさんの参考URLにある 使用例 を見てみましょう

zigen8513
質問者

お礼

free( pGetEnv ); を追加することで解決しました。 全くの思い違いだったようです。。 ポインタを扱う際はもっと慎重にならないといけないですね。 また今後は思い込みでデバッグしないよう気をつけます。 問題解決したので、失礼ながらまとめてお礼とさせて頂きます。 ご回答ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
noname#208124
noname#208124
回答No.2

「free の呼び出しによるメモリの解放は、呼び出し元プログラムが行います。」って書いてるのになー、MSDNに

参考URL:
http://msdn.microsoft.com/ja-jp/library/ms175774.aspx
全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • メモリリークについて

    VC6.0でデバッグ実行すると Detected memory leaks! Dumping objects -> ソースファイル名(932) : {136739} normal block at 0x00FD4AC0, 0 bytes long. Data: <> メッセージがあり メモリがリークしているようです メッセージやソースから察するに 0バイトの領域を確保し それを解放したときに起こっているようです 領域をmallocして 解放ではNULLでなければ解放 という処理はしてはいけないことなのでしょうか 0バイトの領域を確保した場合 又は0バイトの領域を確保しないように 処理しないといけないのでしょうか? 知識のある方よろしくお願い致します

  • Visual Studio2008でのメモリリーク

    プログラムを組んでいて、終了すると 以下のようなメモリリークがでました。 desktop\emptyproject ?d?a?E?μ\dxut\core\dxut.cpp(3385): DXUTCleanup3DEnvironment hr=DXUTERR_NONZEROREFCOUNT (0x80040904) D3DX: MEMORY LEAKS DETECTED: 363 allocations unfreed (322368 bytes) D3DX: Set    HKLM\Software\Microsoft\Direct3D\D3DXBreakOnAllocId=0x1a35 to debug MSDNでは DXUTERR_NONZEROREFCOUNT Direct3D デバイスがゼロ以外のリファレンス カウントを持っているため、一部のオブジェクトが解放されませんでした。 とありますが、この意味もよく分かりません。 今までのメモリリークは Dumping objects -> {343} normal block at 0x0207F288, 2240 bytes long. のように割り当てられたブロックが分かりましたが、 上の様なメモリリークは初めてで、 文からメモリリークの原因を検出することができないでいます。 何故、下ではなく上の様なエラー文になるんでしょうか?

  • メモリリークの件

    メモリリークについて教えてください。 最近VC++を勉強中なのですが、メモリリークというものを知り、_CrtDumpMemoryLeaks()をしたところ、以下のコメントが出力されました。 [コメント] Detected memory leaks! Dumping objects -> strcore.cpp(118) : {71} normal block at 0x00344978, 20 bytes long. Data: < cmd.> 01 00 00 00 07 00 00 00 07 00 00 00 63 6D 64 2E {48} client block at 0x003428E8, subtype 0, 64 bytes long. a CDynLinkLibrary object at $003428E8, 64 bytes long {43} client block at 0x00342720, subtype 0, 64 bytes long. a CDynLinkLibrary object at $00342720, 64 bytes long {41} client block at 0x003425D0, subtype 0, 64 bytes long. a CDynLinkLibrary object at $003425D0, 64 bytes long Object dump complete. スレッド 0x584 終了、終了コード 0 (0x0)。 上記のコメントから、メモリリークを起こしていることはわかりました。ただ、strcore.cppというクラスは作成していないのですが、エラーが出ます。 多分他の関数から呼ばれているクラスだと思うため、クラス等をコメントアウトして調べたのですが、エラーがまだ出力されます。 (Data: < cmd.> 01 00 00 00 07 00 00 00 07 00 00 00 63 6D 64 2Eここは自作クラス上の問題だと思います。) newとかの解放はしているのですが、他にメモリリークをする原因ってあるのでしょうか?

  • VC++ オリジナルDLLを使用するとアプリを終了させる時にメモリリークする

    VisualStudio2005 C++ユーザです。 メモリリークの解決の糸口を探しています。 オリジナルDLLでクラスを作成しそれをオリジナルアプリ側で宣言だけして実行、アプリを閉じると「Detected memory leaks!」と表示されます。 アプリもDLLもデフォルト状態での使用のため、何が原因かさっぱりです。 解決の手引きお願い致します。 ●作成DLL ・DLLの種類>MFC拡張DLL ・クラスはエクスポートするように記述変更  >class AFX_EXT_CLASS CHogehoge : public CObject ・メンバ関数 InitHogehoge() として「int i=0;」のみ記述 ●作成アプリ(MDI形式) ・プロジェクト形式 MFC標準 ・共有DLLでMFCを使用に設定 ・以下のようにクラスの宣言  >例 void CTestApp::OnAppAbout()内にCHogehoge abc;を宣言 ●現象 ・アプリを終了させた時に以下が出力される Detected memory leaks! Dumping objects -> d:\実験\f_tool\f_tool.cpp(53) : {65} client block at 0x003B9028, subtype c0, 64 bytes long. a CDynLinkLibrary object at $003B9028, 64 bytes long a CDynLinkLibrary object at $003B9028, 64 bytes long {59} client block at 0x003B3298, subtype c0, 64 bytes long. a CDynLinkLibrary object at $003B3298, 64 bytes long a CDynLinkLibrary object at $003B3298, 64 bytes long Object dump complete. F_TOOL.DLL Terminating! プログラム '[192] Test.exe: ネイティブ' はコード 0 (0x0) で終了しました。 ●特記事項 エクスポートしたクラス自体は参照出来ているので基本的なミスはないつもり。 出力の「d:\実験\f_tool\f_tool.cpp(53) : {65} client block at ・・・.」はDLL側の「new CDynLinkLibrary(F_TOOLDLL);」行。 宜しくお願い致します。

  • Detected memory leaks!

    VS2010を使用しています。 複数人で同じプロジェクトを編集しています。 いつからか「Detected memory leaks!」が多発するようになり、Dumping Objectsの結果からいくつかは修正できたのですが、 ---------------------------------------- f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(156) : {34985} normal block at 0x05ECE620, 104 bytes long. Data: < }R+ + > 84 CF 7D 52 2B 00 00 00 2B 00 00 00 01 00 00 00 ---------------------------------------- 上記の内容だけは意味がわかりません。 他の回答に「_CrtDumpMemoryLeaks」の実行場所をできるだけ後にするというようなことで対策できたようですが、このプロジェクトでは、記述していません。(明示的には実行していない) 何か、何かアドバイスをいただけたら助かります。 よろしくお願いいたします。

  • ライブラリ関数

    文字列をコピーする(strcpy) 文字列の長さを調べる(strlen) 配列の長さを調べる(sizeof) #include <stdio.h> #include <string.h> int main(void) { char s1[128] = "ABCD"; char s2[128] = "EFGH"; char s3[128] = "IJKL"; strcpy(s2, s1); strcpy(s3, s2); puts("s1をs2にs2をs3にコピーしました。"); printf("s1 = %s\n", s1); printf("s2 = %s\n", s2); printf("s3 = %s\n", s3); printf("文字列%sの長さは%uです。\n",s3,(unsigned)strlen(s3)); printf("文字列%sの長さは%uです。\n",s3,strlen(s3)); return (0); } char *strcpy(char *d, const char *s) { while (*d++ = *s++) printf("pointer=%s \n",d); } /* 文字列sをdにコピーする[配列版] */ char *strcpy(char d2[], const char s2[]) { unsigned i=0; while (d2[i] = s2[i]){ i++; printf("hairetsu=%s\n",&d2[i]); } } /*--- 文字列strの長さを返す[ポインタ版] ---*/ size_t strlen(const char *s) { size_t len = 0; while (*s++) len++; return (len); } /*--- 文字列strの長さを返す[配列版] ---*/ unsigned strlen(const char str[]) { unsigned len = 0; while (str[len]) len++; return (len); } c:\program files\microsoft visual studio 8\vc\include\string.h(73) : 'strcpy' の宣言を確認してください。 メッセージ: 'This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_DEPRECATE. See online help for details.' c:\program files\microsoft visual studio 8\vc\include\string.h(73) : 'strcpy' の宣言を確認してください。 メッセージ: 'This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_DEPRECATE. See online help for details.' c:\documents and settings\owner\my documents\visual studio 2005\projects\test8-3\test8-3\test8-3.c(48) : error C2084: 関数 'char *strcpy(char *,const char *)' は既に本体を持っています。 c:\program files\microsoft visual studio 8\vc\include\string.h(73) : 'strcpy' の前の定義を確認してください c:\documents and settings\owner\my documents\visual studio 2005\projects\test8-3\test8-3\test8-3.c(68) : error C2084: 関数 'size_t strlen(const char *)' は既に本体を持っています。 c:\program files\microsoft visual studio 8\vc\include\string.h(80) : 'strlen' の前の定義を確認してください 上記の問題が解決できません。助けてください><

  • 「繝・せ繝・」となる文字化け

    「テスト」を以下でデコードすると「繝・せ繝・」となってしまいます。 URL test.cgi/q_テスト/ $ENV{'PATH_INFO'}と「q_テスト」を使うことを前提として、「テスト」と正常に取る方法はありますでしょうか。 ご教授お願いします。 $buffer = $ENV{'PATH_INFO'}; $buffer = substr($buffer,1); @lens = split(/\//,$buffer); foreach $len(@lens){ ($name, $value) = split(/_/,$len,2); $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; &jcode'convert(*value,'sjis'); $value =~ s/\t/ /g; $value =~ s/\n//g; $FORM{$name} = $value; }

    • ベストアンサー
    • Perl
  • memtest86+の8352GB/sの意味1

    memtest86+ Ver. 4.20(http://www.memtest.org/のmemtest86+-4.20.iso.zip。iso版。)を教えていただき、PC3-10600のメモリー24GB(シリコンパワー SP004GBL TU133V01 4GB×6枚)を、マザーボードASUS P6X58D-E、CPU Intel i7 950のパソコンで、テストしました。 そのときの画面が添付画像です。ピクセル制限のため、画像を2分割して、右半分の画像は後続の「memtest86+の8352GB/sの意味2」という標題の質問に添付しました。 画像の左端列の上から6行目に「Memory: 24G 8352GB/s」とあります。今回テストしたメモリーは24GBなので「24GB」はメモリーの容量だと思うのですが、その右の「8352GB/s」が分かりません。 (1)「8352GB/s」はメモリーの伝送速度でしょうか。 (2)PC3-10600の伝送速度は、Wikipedia(http://ja.wikipedia.org/wiki/DDR3_SDRAM)によると10.667GBです。「8352GB/s」は10.667GBよりも少し遅いのですが、なぜでしょうか。 (3)今回は、上記のメモリー以外に、Samsung 1Rx8 PC3-106000U-09-11-A1 2GB 1枚も、上記の同じパソコンでテストしました。型番から分かるように、これもPC3-10600のメモリーです。このSamsungのメモリーのテスト画面では、「8352GB/s」のところの数字が「6260GB/s」でした。同じPC3-10600なのになぜ「8352GB/s」と「6260GB/s」のように値が異なるのでしょうか。 (4)この「8352GB/s」のところに示される値は、同じPC3-10600であっても、メーカーによってまた製品によって、千差万別なのでしょうか。 (5)この「8352GB/s」のところに示される値が大きいメモリーの方がいいように思うのですが、そのようなメモリーを見つけるにはどうすればいいのでしょうか。

  • C言語 変換指定%sについてです。

    現場での経験もあるPGなのですが、C言語の基礎を復習していたら疑問に思うことが出てきてしまったので、質問させて下さい。 printf関数などに使われる変換指定%sについてですが、 char word[] = "test"; char *pointer; pointer = word; とした場合、pointerの値は文字列wordの先頭アドレスになるので、 printf ("%x", pointer); とすれば、そのアドレス値が表示されるのはとてもよくわかるのですが、 printf ("%s", pointer); とした場合に、"test"と表示されるのがイマイチ納得できないんです。 printf ("%s", *pointer); なら、まだわかるんですけど・・・ 変換指定の%sというものは、 「アドレスを受け取って、受け取ったアドレスにある文字列を\0がくるまで表示する」 というものなのでしょうか? int型のポインタで同じように printf ("%d", pointer); とすると、pointerの値であるアドレスが10進数表示されて、pointerが指している変数の値を表示するには、 printf ("%d", *pointer); としなければならないわけで、そういうことをいろいろ考えていたら、収拾がつかなくなってしまって(^_^;) 「とにかく%sはそういうものなの!!」と丸暗記すれば困るようなことはないのですが、どうにもモヤモヤしっぱなしなので、%sの動きについて詳しくお分かりの方がいらっしゃいましたら、ご教授下さい。 よろしくお願いしますm(__)m

  • 関数をメモリにマッピングしてみたいのですが質問させてください。

    関数をメモリにマッピングしてみたいのですが質問させてください。 C言語で以下のようなプログラムを完全に趣味で作って遊んでみました。 まぁ当然のことながらエラーで落ちてしまうのですが(関数ポインタと変数のポインタはメモリの位置が違うので当然と言えば当然なのですが)どうにかしてこんな感じのことをやる方法ってないですかね? #include <memory.h> typedef void ( *LPTESTFUNC )(); void test(){} main() { #define BUFFER_SIZE 100   char buffer[BUFFER_SIZE]={0};   memcpy( buffer, test, BUFFER_SIZE );   ( ( LPTESTFUNC )buffer )(); } /** VisualStudio2008 AcademicEdition Windows7 64bit UltimateEdition Core i7 920(2.67GHz) メモリ:12GB 言語:C言語 */

このQ&Aのポイント
  • 筆まめ33を新たに購入し、宛名と文面を作成し、年賀状は作成できたのですが、その後修正や追加のため、改めてファイルを開こうとしました。が、FWAファイルというものにガードされていて、どうにも開けません。
  • ソースネクスト株式会社の製品・サービスの中である筆まめ33において、宛名と文面を作成し、年賀状を作成することは可能ですが、その後の修正や追加作業に際して、FWAファイルがガードされており、開けることができません。
  • 筆まめ33を購入し、宛名と文面を作成した後、年賀状を作成したが、その後の修正や追加作業において、FWAファイルがガードされており、開けることができない状況にあります。ソースネクスト株式会社の製品・サービスについて、ご教示いただきたくお願いいたします。
回答を見る