0

ゲーム内のいくつかのオブジェクトに OpenCV 2 の cv::Mat 構造を使用しています。cv::Mat*あるオブジェクトが別のオブジェクトの cv::Mat を変更する必要がある場合など、これらは直接渡されることもあれば、ポインターによって渡されることもあります。私は自分でメモリを管理しなければならないことに慣れていますが、cv::Mat が参照カウントを使用していることは理解しています。ほとんどの場合、すべてが機能しているように見えますが、Xcode のデバッグ モードで実行すると、次のエラーが発生することがあります。

malloc: *** error for object 0x3000000000000000: pointer being freed was not allocated
*** set a breakpoint in malloc_error_break to debug

これは、次のように 2 つの cv::Mats を関数に渡すと発生します。

Find(this->fillShape, shape->fillShape)

ただし、このエラーは、この行に出くわすたびに発生するわけではありません。これをどのようにデバッグしますか?

4

1 に答える 1

0

セクション 7.20.3.2 から C99 標準のフリー関数:

The free function causes the space pointed to by ptr to be deallocated, that is, made available for further allocation. If ptr is a null pointer, no action occurs. Otherwise, if the argument does not match a pointer earlier returned by the calloc, malloc, or realloc function, or if the space has been deallocated by a call to free or realloc, the behavior is undefined.

これをデバッグするための私の提案は、開いている cv ドキュメントを読んで、各マトリックスにメモリを適切に割り当てていることを確認することです。cv::Mat の内部は「ヘッダー」であり、実際のデータが格納される割り当てられたメモリへのポインターです。マトリックスを宣言すると「ヘッダー」が作成されますが、Mat が指すメモリを割り当てるには、コピーか割り当てかにかかわらず、オブジェクトへの個別の呼び出しが必要です。この問題は、参照カウントがゼロを下回り、デストラクタが呼び出される前に内部メモリを割り当てなかったことが原因である可能性がありますが、cv::Mat のデストラクタの経験はあまりありません。ここで最初のコード例を見てください: http://docs.opencv.org/doc/tutorials/core/mat_the_basic_image_container/mat_the_basic_image_container.html

于 2013-10-15T21:36:22.567 に答える