閉じる

MFCと typeid(T).name()

アプリケーション終了時にメモリリークが報告される。
ほとんどの箇所でスマートポインタを使っているのでリークしそうなところは限られるけど、そういうわけでもない。
_CrtSetBreakAllocを頼りに追ってゆくと、typeid.name()の中で発生している。
typeidって staticな領域にあるんじゃないの?とか思いつつ調べてみると以下の記事に行き着いた。
MFC をスタティックリンクするプログラムで、ランタイムタイプ情報( typeid )を使用するとメモリリーク する
「typeid.nameが mallocを使っているけど、freeするのはリークチェックの後だから」という事らしい。
確かにデバッガで追ってみると nameの中で mallocしている。
原因はわかったけど nameは使いたい。
使いたいが、使うとリークを見逃す可能性が上がるんだよなぁ
どうする?
nameに代わる何かはないかと調べてみたら、raw_nameがあるな。
前者がマングルされた文字列を返すのに対し、後者は文字通り内部的な文字列を返す。
重要なのは後者は mallocを呼ばない(らしい)という事。
今回はシリアライズに使うだけなので識別さえ出来れば内容はどうでも良いので nameを raw_nameに置き換えて解決。
しょーもないことに時間を食われたな。

コメントを残す

メールアドレスが公開されることはありません。必須項目には印がついています *

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)