OpenCVのcv::viz::writeCloudがis_block_type_valid(header->_block_use)とか_CrtlsValidHeapPointer(block)で落ちる

Visual Studio 2017でC++を書いて実行したら何やらエラーで落ちてしまいました。どうにもOpenCVの関数であるcv::viz::writeCloudを呼び出したときに落ちてるらしいことはわかったものの、解決するまでちょっと時間がかかったのでメモしておきます。

現象

ずっとDebugモードで動かしていたプログラムをReleaseモードで実行すると、このようなエラーが表示されました。

# エラー内容
File: minkernel\crts\ucrt\src\appcrt\heap\debug_heap.cpp
Line: 908

Expression: is_block_type_valid(header->_block_use)

むむむ。。。

偶発的に起こるエラーなのか定常的に出るエラーなのか調査するために何度か実行していると、違うエラーメッセージも表示されました。

# エラー内容
File: minkernel\crts\ucrt\src\appcrt\heap\debug_heap.cpp
Line: 904

Expression: _CrtIsValidHeapPointer(block)

ふむむ。。。なんかヒープが破壊されているのか?なんかメモリ周りのエラーっぽいです。

エラーメッセージでググってみると、異なるバージョンのVisual Studioでビルドしたライブラリを使用したり、古いVCで作ったプロジェクトを新しいVCにアップグレードした場合、このエラーが発生することがあるようです。

_CrtIsValidHeapPointer(block) exception on load
OpenCV+VS2012上でstd::vectorがassertion errorを起こす
以前VS2010で作成したC++のプログラムを動かしてみたらstd::vectorの値の操作をおこなうあたりで Debug Assertion Failed: _CrtIsValidHeapPoint

ただ、このPCはVC 2017以外入れたことないので、VCのバージョンの違いが原因ではなさそうです。

あとはアドレスの位置ずれが原因でも発生するようですが、基本スマートポインタとvectorくらいしか使っていなかったので、その可能性も薄そうです。

クラス | C++ プログラミング解説

原因を切り分けていくとどうにもOpenCVのcv::viz::writeCloudを呼び出しているときに落ちている模様。原因特定を進めていき、cv::viz::writeCloudに入力している引数たちの中身やサイズは問題なさそうなので、cv::viz::writeCloudの中で良からぬことが起きていそうだという可能性が浮上しました。

解決策

結論から言うと、OpenCVとVTKのバージョンを最新にすると解決しました。

今まで使用していたのは

  • OpenCV 3.4.0
  • VTK 8.1.1

だったのですが、これを最新安定版の

  • OpenCV 3.4.3
  • VTK 8.1.2

を使うようにしたら、上記のエラーは起こらなくなりました。

結局根本的な原因まではわからなかったのですが、ひとまず動くようになったためよしとしました。もしVTKとかOpenCVの不具合だったとしても、issueを立てるくらいしかできそうにないので・・・

コメント