melt日記

.NETすらまともに扱えないへたれのページ

ホーム 連絡をする 同期する ( RSS 2.0 ) Login
投稿数  111  : 記事  3  : コメント  8228  : トラックバック  41

ニュース

わんくま同盟

わんくま同盟

C# と VB.NET の質問掲示板

iKnow!


Dictation



書庫

ATL にはメモリリークを検出するための機構があって、atldbgmem.h をインクルードすることにより、メモリリークを検出することが出来るらしいです。

面白そうだから早速使ってみようと思って、stdafx.h にインクルードしてからコンパイルしてみたのですが……。

fatal error C1189: #error :  <atldbgmem.h> must be included before other ATL and CRT headers

どうやら ATL や CRT のヘッダより前で読み込む必要があるみたいです。

まあ確かにそういうのはあり得るかもということで先頭に持ってきて再度コンパイルしてやります。

すると……ものすごい数のエラーが飛び出してきます。

主に xdebug や xlocale の operator new でエラーが発生しているらしく、何でだろうと思って調べてみると、atldbgmem.h でこんな一文を見つけました。

#define new new(__FILE__, __LINE__)

これ作った奴あほじゃね?

こんなことをすればどうなるか目に見えてると思うのですが……。

どうやらこの定義が原因みたいですね。

とりあえず xdebug とかは STL の一部だったと思うので、STL のヘッダを atldbgmem.h の上に置けばいいだろうと思って、そうしてからコンパイルしてみたのですが、

fatal error C1189: #error :  <atldbgmem.h> must be included before other ATL and CRT headers

orz

いやまあ、STL が CRT を使ってるからなんでしょうけど……。

何で出来へんねん!ってことを世界に聞いてみると、こんなのを見つけました。

  • memory leak detection Peter Carlson (06/15/04)

    > atldbgmem.h cannot be used together with STL.

    > atldbgmem.h cannot be used together with STL.

    > atldbgmem.h cannot be used together with STL.

    ダメじゃん!

     

    まあ無理だねってことで諦めようと思ったんですが、よく考えてみれば new の定義を消せば良いだけじゃね?ってことに気が付きました。

    #include <atldbgmem.h>
    #undef new

    これでいいんじゃね?と思ってこれでコンパイルしてみると……

    キタ━(゚∀゚)━!!

    どうやらこれで大丈夫なようです。

    で、必要なヘッダをインクルードした後に、

    #define new new(__FILE__, __LINE__)

    とすれば完了です。

    よしコンパイル!

    ……コンパイルは出来たけど、今度はリンク時に operator new が既に定義されているとかうるさいので libcmtd.lib をリンクから外してやることに。

    今度こそ!

    error LNK2005: "int ATL::_atlMemoryLeakOverride" (?_atlMemoryLeakOverride@ATL@@3HA) は既に Main.obj で定義されています。

    え……どゆこと?atldbgmem.h を覗いてみると、

    BOOL _atlMemoryLeakOverride = FALSE;

    宣言じゃなくて定義されてるやん!

    そりゃリンク通るわけないわ……。

    ということでもう考えるのめんどいからコメントアウトしました。みんな真似しちゃダメだよ♪

    するとちゃんとリンクが通って、リークも検出できているみたいでした。

     

    ☆-(ノ゚Д゚)八(゚Д゚ )ノイエーイ

     

    ただまあ、これぐらいなら普通に CRT の機能を使えば十分に出来るような気がするんだけどね……。

     

    結論:atldbgmem.h は逝ってよし!

     

    さて帰ろ帰ろ

     

    追記:

    atldbgmem.h を作った人は、単一のファイルでしかテストしてないのかな?

    ↑の最後のエラー、2つのファイルで同時にインクルードすると絶対に出るような気がするんだけど……。

     

    追記その2:

    ↑は atldbgmem.h の悪いところばっかり書いていますが、実際は良い点もいくつかあって、例えば HeapAlloc() や HeapCreate()、VirtualAlloc() といったメモリ確保にも対応していたり、メモリの確保・解放の時点での詳細なログが吐かれたり、メモリが壊れているかどうかがチェックできたり、自前のアロケータのリーク検出も簡単に作ることが出来ます。

    あとそれから、ログはファイルに吐き出すことが出来ます。これはハンドルを渡すことで実現しているので、やろうと思えば stdout やパイプに吐き出すことも出来ます。

    まあどれも CRT の機能を wrap した上で実現しているので、やろうと思えば自分で作ることも可能です。が、わざわざ自分で作る必要もないでしょうから、これを利用してみるのも良いかと思います。

  • 投稿日時 : 2007年8月10日 18:45

    コメント

    # re: [C++]atldbgmem.h 2007/08/10 21:43 とほりすがり
    #ifndef HOGE_ALT_MEMORY_LEAK_OVERRIDE
    #define HOGE_ALT_MEMORY_LEAK_OVERRIDE
    BOOL _atlMemoryLeakOverride = FALSE;
    #endif

    # re: [C++]atldbgmem.h 2007/08/10 22:19 melt
    それだと一つのファイルから複数インクルードしたときに1回しか定義されないだけであって、リンク時には全ての場所で定義されてるからダメかと思われます。

    # re: [C++]atldbgmem.h 2007/08/11 23:38 とほりすがり
    #ifndef HOGE_ALT_MEMORY_LEAK_OVERRIDE
    #define HOGE_ALT_MEMORY_LEAK_OVERRIDE
    BOOL _atlMemoryLeakOverride = FALSE;
    #else
    extern BOOL _altMemoryLeakOverride;
    #endif


    # re: [C++]atldbgmem.h 2007/08/12 0:55 melt
    い、いや、define の有効範囲は1つの cpp ファイル内だけなので、それだと1つの cpp ファイルにつき1回ずつ定義されちゃうのでリンクで失敗します……。

    全部 extern にしておいて、どっかの cpp ファイルで定義しておくのが一番素直なやり方なんでしょうね。
    やろうと思えば適当にクラスを作って static に宣言しておくとか、もしくはこの変数は1ヵ所しか使ってないのでその関数内で static 書いてやるとか出来ますが、どのみち atldbgmem.h を編集する必要があるんですよね……。

    # Oakley Frogskins Sunglasses 2013/03/16 6:34 http://cheapoakleyfrogskinssunglasses.webs.com/
    The ice is hard enough to skate on.I just made it!He came to the point at once.There are mice next to the refrigerator, under the sink and inside the cupboard!This wayHe used to learn everything by rote.He used to learn everything by rote.Congratulations!He has a remarkable memory.On behalf of my company, I would like to welcome you here.

    # Oakley Frogskins Sunglasses 2013/03/17 15:23 http://cheapoakleyfrogskinssunglasses.webs.com/
    It's nothing to be surprised about.You did right.Good job!The play may begin at any moment.Truth is the daughter of time.He said he was educated in the United States.He said he was educated in the United States.My car needs washing.I think so.I expect to be there this evening.

    # re: Visual Studio の unit test framework は x64 で動作できない 2015/10/10 10:42 lily-ya
    @ting1010
    http://www.katespadebagsus.com<br />http://www.nikefree40flyknit.net<br />http://www.usalouisvuittonoutlet-stores.com<br />http://www.nikeairmaxshoes-store.com<br />http://www.michaelkorsbags.date<br />http://www.michaelkorsoutletonline.review<br />http://www.2015coachbags.net<br />http://www.katespadecrossbody.com<br />http://www.jameshardenshoes.org<br />http://www.michaelkorsoutletmk.cc<br />http://www.cheaplouisvuittonbagso.com<br />http://www.katespadesurprisesale.com<br />http://www.cheaplvbags-top.net<br />http://www.michaelkorsoutlet.review<br />http://www.coach80off.com<br />http://www.louisvuittonstore2015.com<br />http://www.23isbackreleasedate.org<br />http://www.cheap-airjordanshoesforsale.com<br />http://www.louisvuitton-lv.us.com<br />http://www.louisvuittonoutlet--2014.com<br />http://www.nikeflyknitracer.org<br />http://www.curryoneshoes.net<br />http://www.stefanjanoskimax.com<br />http://www.michaelkorsoutlet.win<br />http://www.mkfactoryoutlet.net<br />http://www.nikeairmaxzero.net<br />http://www.cheapnikeairmaxltd.com<br />http://www.nikeflyknitlunar.net<br />http://www.louisvuitton-christmas.com<br />http://www.nikefree30flyknit.net<br />http://www.michaelkorsoutletonline2015.org<br />http://www.coachbagssaleuk.com<br />http://www.mk-outletonline.org<br />http://www.rosherunblack.net<br />http://www.michaelkorsoutletstore.review<br />http://www.coachhandbags2015.org<br />http://www.airmax90-hyperfuse.net<br />http://www.michaelkors-outlet.xyz<br />http://www.nikeoutlet-hot.com<br />http://www.2015michaelkorsoutletstores.cc<br />http://www.coachbags2015.net<br />http://www.michaelkorsmkbags.net<br />http://www.roshesshoes.com<br />http://www.nike-airmaxzero.net<br />http://www.michaelkors-mk.org<br />http://www.roshes.net<br />http://www.23isbackrelease.net<br />http://www.nikeairmax90classic.com<br />http://www.katespade2015.org<br />http://www.michaelkors-outletstore.xyz<br />http://www.coachfactoryoutletonline2015.com<br />http://www.coachbags-onsale.net<br />http://www.nikeflyknitlunar1.com<br />http://www.nike-airmaxthea.org<br />http://www.katespade-usa.org<br />http://www.airmax90-ice.com<br />http://www.mkmichaelkorsbags.net<br />http://www.coachfactory2015.com<br />http://www.michaelkorsbags.win<br />http://www.mkmichaelkorsuk.com<br />http://www.cheaplouisvuittonbagso.com<br />http://www.mkfactoryoutlet.net<br />http://www.coachfactoryoutletonline2015.com<br />http://www.michaelkorsoutlet.review<br />http://www.coachbags-onsale.net<br />http://www.louisvuittonoutlet--2014.com<br />http://www.michaelkorsbags.win<br />http://www.airmax90-ice.com<br />http://www.2015michaelkorsoutletstores.cc<br />http://www.cheap-airjordanshoesforsale.com<br />http://www.mkfactoryoutlet.net<br />http://www.cheapnikeairmaxltd.com<br />http://www.louisvuittonstore2015.com<br />http://www.nikeairmaxzero.net<br />http://www.mk-outletonline.org<br />http://www.nikeoutlet-hot.com<br />http://www.michaelkorsoutletmk.cc<br />http://www.coachfactoryoutletonline2015.com<br />http://www.katespadebagsus.com<br />http://www.coachbagssaleuk.com<br />http://www.2015michaelkorsoutletstores.cc<br />http://www.cheaplouisvuittonbagso.com<br />http://www.cheaplvbags-top.net<br />http://www.curryoneshoes.net<br />http://www.louisvuittonstore2015.com<br />http://www.cheap-airjordanshoesforsale.com<br />http://www.coachfactoryoutletonline2015.com<br />http://www.nike-airmaxzero.net<br />http://www.nikefree40flyknit.net<br />http://www.airmax90-hyperfuse.net<br />http://www.mkfactoryoutlet.net<br />http://www.louisvuittonstore2015.com<br />http://www.mkfactoryoutlet.net<br />http://www.mkmichaelkorsuk.com<br />http://www.mk-outletonline.org<br />http://www.2015coachbags.net<br />http://www.michaelkorsoutletonline2015.org<br />http://www.mkmichaelkorsuk.com<br />http://www.stefanjanoskimax.com<br />http://www.coachbagssaleuk.com<br />http://www.michaelkorsoutletonline.review<br />http://www.coachbags-onsale.net<br />http://www.coachbags2015.net<br />http://www.michaelkorsoutletstore.review<br />http://www.nikeairmax90classic.com<br />http://www.michaelkorsbags.date<br />http://www.nikeairmaxzero.net<br />http://www.coachhandbags2015.org<br />http://www.airmax90-ice.com<br />http://www.nike-airmaxthea.org<br />http://www.michaelkors-outletstore.xyz<br />http://www.michaelkorsoutletonline.review<br />http://www.mkmichaelkorsuk.com<br />http://www.mkmichaelkorsbags.net<br />http://www.rosherunblack.net<br />http://www.katespade-usa.org<br />http://www.michaelkorsbags.date<br />http://www.mkmichaelkorsbags.net<br />http://www.2015michaelkorsoutletstores.cc<br />http://www.nikefree40flyknit.net<br />http://www.coach80off.com<br />http://www.coachbags2015.net<br />http://www.nikefree30flyknit.net<br />http://www.jameshardenshoes.org<br />http://www.mkmichaelkorsbags.net<br />http://www.michaelkorsoutletmk.cc<br />http://www.nikeoutlet-hot.com<br />http://www.nike-airmaxthea.org<br />http://www.cheaplouisvuittonbagso.com<br />http://www.michaelkorsoutletmk.cc<br />http://www.michaelkorsoutlet.win<br />http://www.roshes.net<br />http://www.michaelkorsoutletstore.review<br />http://www.michaelkorsoutletstore.review<br />http://www.stefanjanoskimax.com<br />http://www.curryoneshoes.net<br />http://www.michaelkorsoutletmk.cc<br />http://www.nikeflyknitlunar1.com<br />http://www.coach80off.com<br />http://www.katespade2015.org<br />http://www.michaelkors-outlet.xyz<br />http://www.nikeairmax90classic.com<br />http://www.louisvuittonstore2015.com<br />http://www.2015michaelkorsoutletstores.cc<br />http://www.2015michaelkorsoutletstores.cc<br />http://www.nikeairmaxshoes-store.com<br />http://www.nike-airmaxzero.net<br />http://www.coachbags-onsale.net<br />http://www.cheaplvbags-top.net<br />http://www.michaelkorsoutlet.review<br />

    # gNjYBzYDrQ 2021/07/03 2:28 https://amzn.to/365xyVY
    Look advanced to more added agreeable from you! However, how could we communicate?

    Post Feedback

    タイトル
    名前
    Url:
    コメント