2016-10-14 2 views
0

マイクロソフトでは、リークチェックギアをデバッグビルドで使用すると、何十年ものバグがあります。リークは、typeinfo.name()のようなC++型情報を使用しているときにランタイムライブラリによって行われた割り当てから報告されます。 Microsoft ConnectのMemory leaks reported by debug CRT inside typeinfo.name()も参照してください。Microsoftのtypeinfo.name()メモリリークを修復する方法はありますか?

私たちは、ほぼ同じ時間の間漏れがあるため、エラーレポートとユーザーリストのディスカッションを受けています。マイクロソフトのバグは、ユーザープログラムからの実際の漏洩を隠す可能性もあります。後者の点は私にとって特に気になる点です。なぜなら、マスキングのために実際の問題に傾いていない可能性があるからです。

typeid(T)typeinfo.name()を使用しているため、リークを撲滅しようとしたいと思います。私の質問は、Microsoftのバグを回避するにはどうしたらいいですか?利用可能な回避策はありますか?

+0

( 'typeinfo.nameを使用しないでください) '? – Yakk

+0

Samに感謝します。 [ソースコードのライセンス]に関する情報はありません(http://www.google.com/search?q=license+microsoft+c%2B%2B+runtime+source+code)。リンクがありますか?また、この場合、修正プログラムはどのように機能しますか?すべてのユーザーがライセンスを取得する予定ですか?あるいは、 '.local'のDLLリダイレクトとのサイドバイサイドリンクを使ってライセンス交付して配布しますか?後者は実行可能な選択肢のようには見えませんが、私はプロセスを理解しています。 – jww

+1

提案:あなたは 'typeinfo.name()'を使っているすべての場所を再訪し、いくつかのMeyerのシングルトン関数やテンプレートなどを呼び出すものに置き換えてください。少なくとも、 "漏れ"の量は限られています。静的変数。 –

答えて

1

Qのコメントの私の提案の行に。全く漏れを除外することが可能ていないようですので、

次の最も:あなたはメモリリーク(少なくともC++ 11以降)type_info.name()については


type_indexを使用することができますif (valueType == typeid(int))については

物事は彼らの数を減らす(1つのタイプの尋問のために漏れただけに)、二次的に、彼らは報告目的のためにそれらをタグ付けするでしょう。
いくつかのテンプレート付きクラスの中にあるので、 'mem leak'レポートがクラス名(または少なくとも割り当てが発生したソースファイル)を使用することを期待できます - この情報を使用して、メモリ 'レポート。

代わりtypeid(<typename>)を使用するので、あなたのようなものを使用します。

"ファイルtypeid_name_workaround.hppを"

template <typename T> struct get_type_name { 
    static const char* name() const { 
    static const char* ret=typeid(T).name(); 
    return ret; 
    } 
}; 

その他.cpp/.hppファイル

#include "typeid_name_workaround.hpp" 

struct dummy { 
}; 

int main() { 
    // instead of typeid(dummy).name() you use 
    get_type_name<dummy>::name(); 
} 
+0

エイドリアンに感謝します。それはうまくいかなかった。報告されたメモリリークの数は32から40に増加しました。一時的なものが問題を悪化させたと思います。しかし、提案をありがとう。 – jww

+0

ああ、まあ、どうすればいいですか?私は32個の「適切ではない」リーク(その数は時間の経過とともに増加しない)だけで生きていました。はい、プログラムを終了する前にメモリを解放するために何もできないので、私はそれらをリークと呼ぶことができます。しかし、[メモリがすべて解放されてから終了する必要があると誰もが同意しているわけではありません](https://blogs.msdn.microsoft.com/oldnewthing/20120105-00/?p=8683)(... MSDNのブログエントリ、それはあなたを驚かせるでしょうか?私は、あなたがこのバグの修正まであなたの息を止めないように伝えるべきだと思います。乾杯。 –

+0

アダレンに感謝します。ええ、私は前に "そのリークではない"位置を見てきました。他人やテストの結果に影響を与えない限り、その罰金はあると思います。しかし、この場合、テストに干渉したり、リークを隠すことによって非MSコードに影響を与えます。おそらくセキュリティ上のバグです。また、DLLのようなライブラリでコードを使用すると、Javaや.NETなどの管理言語から呼び出されたときにメモリリークが無限に拡大する可能性があります。 Javaと.NetはDLLを複数回ロードしてアンロードします。 – jww

関連する問題