none
MFC + OpenCV(v4.2) のメモリリークを無くしたい RRS feed

  • 質問

  • VisualStudio2019 C++MFC を使ってソフトを開発しています。

    OpenCVを使わないとメモリーリークは全くでないですが、
    OpenCVをリンクしDebugモードでOpenCVを使わない部分で起動して終了しただけでメモリリークが大量にでます。

    幾つかのサイトを参考に
    プロジェクトのオプションに/DELAYLOAD:"opencv_world420d.dlllを入れると、
    ソフトを起動して終了した程度ならLeakが出ないようになりました。


    ただOpenCVを使っている部分を流すとやはり同じような量のリークがでます。

    以下の1行を追加しただけでもが同じ量のリークがでました。  (v.Release(); しても同じ)
    cv::VideoCapture v;

    プロジェクトのオプションに  /DELAYLOAD:"opencv_videoio_ffmpeg420.dl を追加してもリークの出るのは変わりありません。

    やろうとしている事はcv::VideoCaptureでmpegファイルを開いて、readで1フレームずつ cv::Matを得ているだけです。


    OpenCVを使い リークを無くすようにしたいのですが、
    方法がありましたらご教授ください。


    • 編集済み AppKey 2020年9月23日 5:38
    2020年9月23日 5:20

回答

  • AppKeyさん、こんにちは。フォーラムオペレーターのKumoです。
    ご返信いただきありがとうございます。

    以下のURLが参考になるかもしれません。
    https://answers.opencv.org/questions/

    どうぞよろしくお願いいたします。

    MSDN/ TechNet Community Support Kumo ~参考になった投稿には「回答としてマーク」をご設定ください。なかった場合は「回答としてマークされていない」も設定できます。同じ問題で後から参照した方が、情報を見つけやすくなりますので、 ご協力くださいますようお願いいたします。また、MSDNサポートに賛辞や苦情がある場合は、MSDNFSF@microsoft.comまでお気軽にお問い合わせください。~

    • 回答としてマーク AppKey 2020年9月25日 9:19
    2020年9月25日 8:58
    モデレータ

すべての返信

  • 更新前の質問文に /MTd について言及されていたような気がします。部分的に静的リンクを使用されていますでしょうか?

    静的にリンクされた CRT を使用すると、暗黙的に、C ランタイム ライブラリによって保存されるステータス情報は CRT のそのインスタンスに対してローカルなものになります。 たとえば、静的にリンクされた CRT を使用する場合、 strtok パーサーの位置 strtok は、 strtok 静的な crt の別のインスタンスにリンクされている同じプロセス (ただし、別の DLL または EXE) のコードで使用される状態とは関係がありません。 反対に、動的にリンクされた CRT では、CRT に動的にリンクされるプロセス内のすべてのコードに対して状態が共有されます。 

    静的な CRT とのリンクによってビルドされた DLL は独自の CRT 状態を持つので、この結果を明確に理解し、期待する場合を除き、DLL 内で CRT に静的にリンクすることは推奨されません。

    とされています。 cv::VideoCapture v; と書いただけでも、コンストラクターはopencv_world420d.dll側で実行されその延長で追加のメモリ確保などが行われることがあります。この場合、動的リンクバージョンが使われます。しかしデストラクターがインライン展開されてしまうとopencv_world420d.dll側は使われず、追加のメモリ解放も静的リンクバージョンが使われます。こういったことが発生すると、動的リンクバージョンのmallocとしてはメモリ解放されていない、ということになりかねません。

    あくまで一例であり、他の原因があるかもしれません。

    2020年9月23日 23:09
  • Resありがとうございます。

    どこかのサイトにスタテックリンクで回避するのが一般的 というのがあってやってみたのですが、OpenCV関係以外でエラーが大量に出たため現在は スタテックリンクはやめて共通DLL 使用して戻してします。

    2020年9月24日 4:56
  • AppKeyさん、こんにちは。フォーラムオペレーターのKumoです。 
    MSDNフォーラムにご投稿くださいましてありがとうございます。

    より良いサポートのため、OpenCVフォーラムにご投稿いただくことをご検討ください。

    お手数ですが、ご協力の程どうかよろしくお願いいたします。 

    MSDN/ TechNet Community Support Kumo ~参考になった投稿には「回答としてマーク」をご設定ください。なかった場合は「回答としてマークされていない」も設定できます。同じ問題で後から参照した方が、情報を見つけやすくなりますので、 ご協力くださいますようお願いいたします。また、MSDNサポートに賛辞や苦情がある場合は、MSDNFSF@microsoft.comまでお気軽にお問い合わせください。~

    2020年9月25日 6:13
    モデレータ
  • OpenCVフォーラム とはURLを教えていただけますでしょうか?
    2020年9月25日 7:48
  • AppKeyさん、こんにちは。フォーラムオペレーターのKumoです。
    ご返信いただきありがとうございます。

    以下のURLが参考になるかもしれません。
    https://answers.opencv.org/questions/

    どうぞよろしくお願いいたします。

    MSDN/ TechNet Community Support Kumo ~参考になった投稿には「回答としてマーク」をご設定ください。なかった場合は「回答としてマークされていない」も設定できます。同じ問題で後から参照した方が、情報を見つけやすくなりますので、 ご協力くださいますようお願いいたします。また、MSDNサポートに賛辞や苦情がある場合は、MSDNFSF@microsoft.comまでお気軽にお問い合わせください。~

    • 回答としてマーク AppKey 2020年9月25日 9:19
    2020年9月25日 8:58
    モデレータ
  • ありがとうございます。

    ここでは返信なさそうなので閉じさせて頂きます。

    2020年9月25日 9:19