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にアップグレードした場合、このエラーが発生することがあるようです。
ただ、このPCはVC 2017以外入れたことないので、VCのバージョンの違いが原因ではなさそうです。
あとはアドレスの位置ずれが原因でも発生するようですが、基本スマートポインタとvectorくらいしか使っていなかったので、その可能性も薄そうです。
原因を切り分けていくとどうにも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を立てるくらいしかできそうにないので・・・
コメント