Visual Studio2008でのメモリリーク

このQ&Aのポイント
  • Visual Studio2008でプログラムを組んでいる際に、終了時にメモリリークが発生する問題が発生しました。
  • エラーメッセージには『DXUTCleanup3DEnvironment hr=DXUTERR_NONZEROREFCOUNT』という文言が表示され、Direct3Dデバイスがゼロ以外のリファレンスカウントを持っているために一部のオブジェクトが解放されない問題が指摘されています。
  • 具体的な原因や解決方法は不明ですが、今までのメモリリークとは異なるエラーメッセージが表示されており、原因の特定が難しい状況です。
回答を見る
  • ベストアンサー

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. のように割り当てられたブロックが分かりましたが、 上の様なメモリリークは初めてで、 文からメモリリークの原因を検出することができないでいます。 何故、下ではなく上の様なエラー文になるんでしょうか?

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

  • ベストアンサー
  • phoenix343
  • ベストアンサー率15% (296/1946)
回答No.1

D3D関連でRelease漏れがないかチェックしましょう。 上記のメモリリークは、Cライブラリでの検出ではなく D3Dで検出されるメモリリークだからね。

crescens
質問者

お礼

無事、メモリリークが取れました。 ありがとうございます。(^_^)/

crescens
質問者

補足

なるほど、そうなんですか。 頑張ってRelease漏れを探します。

関連するQ&A

  • メモリリークの件

    メモリリークについて教えてください。 最近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とかの解放はしているのですが、他にメモリリークをする原因ってあるのでしょうか?

  • メモリリークについて

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

  • _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

  • 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」の実行場所をできるだけ後にするというようなことで対策できたようですが、このプロジェクトでは、記述していません。(明示的には実行していない) 何か、何かアドバイスをいただけたら助かります。 よろしくお願いいたします。

  • 起動時に何のダイアログも表示されない

    こんにちは。 大変恐縮ですがこちらで質問させてください。 開発環境はVC2005のMFCです。 質問内容は題名の通りなのですが、デバッグを実行しても何のダイアログが表示されない という状態になってしまいました。 すぐにデバッグが終了してしまいます。(「デバッグなしで開始」でも同様です。) プロジェクトはダイアログベース、スタティックライブラリ、ソケットを使える設定で 作成しました。 プロジェクトを作成してから他ダイアログを作り全てのダイアログに新しくボタンを配置したのと、初期配置のOK,キャンセルボタンを削除した以外は、コード上に手を加えるなどはしていません。 また、以下のようなエラーコードが出力されました。 Dumping objects -> f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\occmgr.cpp(195) : {75} normal block at 0x003496B8, 488 bytes long. Data: < > E8 03 00 00 00 00 00 00 E9 03 00 00 00 00 00 00 {74} normal block at 0x00349580, 248 bytes long. Data: < > FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 Object dump complete. プログラム '[1528] test.exe: ネイティブ' はコード 0 (0x0) で終了しました。 何か原因と対策等がわかりましたら回答をいただければと思います。 よろしくお願いします。

  • Visual Studioのメモリリークについて

    質問を見ていただいて有り難うございます。 当方、現在MFCのダイアログベースのプログラムを行なっているのですが、プログラム終了時にメモリリークが発生します。 今のところプログラムの動作自体に影響はないのですが、想定外の動作が起こると困るのでなんとかこのエラーを取り除きたいと考えています。 メモリリークの殆どは _CrtSetBreakAlloc(Num);(指定した順序のメモリ割り当て時にブレークポイントを発生させる) を利用して、メモリリークが起こっている部分のブレークポイントをチェックして消したのですが、どうしても残りのメモリリークが消えません。 残りのメモリリークは_CrtSetBreakAlloc(Num)で指定してもブレークポイントが出てきませんでした。 _CrtSetBreakAlloc(Num)は『ファイル名.cpp』のInitInstanceおよびコンストラクタで呼び出してみましたが、どちらも同じ結果になりました。 また、試しに『ファイル名Dlg』クラスを使用しない(ダイアログを開かないようにコメントアウト)ようにして終了しても同じ結果になりました。 _CrtSetBreakAlloc(Num)を設定する適切な位置や、このようなメモリリークが出る原因、解決方法などについてご存知の方がいらっしゃいましたら、お教えください。 よろしくお願いします。

  • 'd3dx9.lib' が開けません。

    DirectXの事で質問があります。 Microsoft Visual C++ 2008 Express Edition で Microsoft DirectX SDK (March 2008)の Matrices.cppというチュートリアルのコードを実行したのですが、 1>LINK : fatal error LNK1104: ファイル 'd3dx9.lib' を開くことができません。 とのエラーがかえってきます。 DirectX エンドユーザー ランタイム (March 2008) も DirectX エンドユーザー ランタイム ウェブインストーラも インストールしましたけれども、解決できません。 ツール オプション で、インクルードファイルとライブラリも DirectX SDK (March 2008)のインクルードとライブラリのパスを指定しました。 プロパティでd3d9.lib d3dx9.lib winmm.libを 追加依存ファイルに設定してます。 それでも、'd3dx9.lib' を開きたくないそうです。 どのようにしたら、Matrices.cppを実行できますでしょうか。 できれば、d3dx9.libも開けるようにしておきたいのですが、 どのようにしたら、d3dx9.libをひらけるようになりますでしょうか。

  • Direct3Dデバイスの作成に失敗しました。

    失礼します。 皆様のお力が借りたいので質問させて頂きます。 ・PC環境 OS:WindowsXP 使用ビデオカード:NVIDIA Geforce6600 メモリ:512MB CPU:Pentium4 3.20GHz 今日久しぶりにイースフェルガナと言うPCゲームを起動したのですが。 「D3DERR_NOTAVAILABLE(8876086ah) ->Direct3Dデバイスの作成に失敗しました。 ハードウェアの能力がプログラムの要求を満たしていない可能性があります。 1024x768x32(X888)(D24S8) HWVP(pure) DX8.1 d3d_core.cpp(322)」 と言うエラーが出て起動できなくなってしまいました。 半年前くらいまではちゃんと動いていたのですが・・・ ビデオカードのドライバが古いのが原因かと思い、ビデオカードのホームページで一番新しいドライバをダウンロードして古いドライバをアンインストールしてからインストールしてみたのですが。(93.71_forceware_winxp2k_international_whql.exeというドライバ) また同じエラーで出来ません。 なにが原因なのかわからないのでなにか分かる方がいらっしゃったら教えてください。 よろしくお願いします。

  • wpf datagrid メモリリーク

    wpfのdatagridを利用してデータ表示しております。 1レコードを多段構成で表示するため、ユーザーコントロールにdatagridを配置し、グリッド内に各コントロールを配置する方法で実現しております。 チェックボックスも配置しており、スクロール時に初期化される現象が発生したため、仮想化をOFFにしております。 少ないデータ件数であれば問題ないのですが、大量データ(3500件程度)の場合には メモリリークしてしまいます。 DataGridにチェックボックスを配置した場合の実装で、上記の事象を 改善する方法をご存知の方がいらっしゃいましたらご教授頂けると幸いです。 以下2つが実装しているxamlとなります。 ★Grid_Tab_Roke_Main  ユーザーコントロールにDataGridを配置したものとして実装しています。 <UserControl x:Class="Grid_Tab_Roke_Main" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:local="clr-namespace:_XX_WPF商品管理" mc:Ignorable="d" d:DesignHeight="200.373" d:DesignWidth="300" Height="Auto" Width="Auto"> <DataGrid ItemsSource="{Binding}" VirtualizingStackPanel.IsVirtualizing="False" VirtualizingStackPanel.VirtualizationMode="Standard" EnableColumnVirtualization="False" EnableRowVirtualization="False" ScrollViewer.CanContentScroll="True" ScrollViewer.IsDeferredScrollingEnabled="True" AutoGenerateColumns="False" CanUserAddRows="False" CanUserDeleteRows="False" HeadersVisibility="None" Margin="0,0,0,0"> <DataGrid.Columns> <DataGridTemplateColumn > <DataGridTemplateColumn.CellTemplate> <DataTemplate> <local:Grid_Tab_Roke_Detail /> </DataTemplate> </DataGridTemplateColumn.CellTemplate> </DataGridTemplateColumn> </DataGrid.Columns> </DataGrid> </UserControl> ★Grid_Tab_Roke_Detail グリッド内にコントロールを配置しており、データテーブルよりバインドしています。項目は全て数点を抜粋して記載しております。 <UserControl x:Class="Grid_Tab_Roke_Detail" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" mc:Ignorable="d" Height="70" Width="1227" Background="White" Loaded="UserControl_Loaded"> <Grid> <TextBox x:Name="Text_Roke" Text="{Binding ロケーション名, Mode=OneTime, StringFormat=\{0:N0\}}" HorizontalAlignment="Left" Height="21" Margin="56,22,0,27" TextWrapping="Wrap" VerticalAlignment="Center" Width="181" RenderTransformOrigin="0.406,0.026" Background="{x:Null}" FontFamily="Arial" VerticalContentAlignment="Center" FontWeight="Bold" MaxWidth="200" MinHeight="16" IsHitTestVisible="True" FontSize="16" Foreground="Black"/> <TextBox x:Name="Text_HinCD" Text="{Binding 商品コード, Mode=OneTime, StringFormat=\{0:N0\}}" HorizontalAlignment="Left" Height="21" Margin="242,22,0,27" TextWrapping="Wrap" VerticalAlignment="Center" Width="62" RenderTransformOrigin="0.406,0.026" Background="{x:Null}" FontFamily="Arial" VerticalContentAlignment="Center" FontWeight="Bold" MaxWidth="150" MinHeight="16" IsHitTestVisible="True" FontSize="16" Foreground="Black"/> <CheckBox x:Name="Chk_Sentaku" Content="選択" IsChecked="{Binding IsSelected.Value, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" HorizontalAlignment="Left" Margin="3,3,0,0" VerticalAlignment="Top" Width="48" Height="65" Checked="CheckBox_Checked" Unchecked="CheckBox_Unchecked" /> <TextBox x:Name="Text_HinNM" Text="{Binding 商品名, Mode=TwoWay, StringFormat=\{0:N0\}}" HorizontalAlignment="Left" Height="21" Margin="304,22,0,27" TextWrapping="Wrap" VerticalAlignment="Center" Width="330" RenderTransformOrigin="0.406,0.026" Background="{x:Null}" FontFamily="Arial" VerticalContentAlignment="Center" FontWeight="Bold" MaxWidth="350" MinHeight="16" IsHitTestVisible="True" FontSize="16" Foreground="Black"/> </Grid> </UserControl>

専門家に質問してみよう