0
OpenCVを使ってマルチスレッドシステムを構築します。OpenCVは、いくつかのイメージを作成し、ベクトルに割り当て、各イメージを別のスレッドに送ります。スレッドがMat
オブジェクトへのポインタを取得するときに、Mat
オブジェクトはもう存在していないようだOpenCV Matrixをデータ構造に割り当てる
std::vector<cv::Mat> images;
for (int i = 0 ; i < 10 ; i++) {
images.push_back(cv::Mat(/* bla bla */));
cv::Mat& mat = images.back();
std::thread(some_function_name, &mat)
}
// Wait here for all threads to join (didn't show its code)
:
これは次のように、それがどのように見えるかです。それはすぐにベクトルに割り当てられていましたが、スタックから拭き取られたときにループが終了したときに実際に破棄された可能性はありますか?
の大きさになり、これを解決するには、あなたが実際に時々起こる 'vector'の自己拡張操作がそれを引き起こすことを言うのですか?ですから、代わりに 'std :: list'を使用すると、それは防止されますか? – SomethingSomething
@SomethingSomething [この記事を読む](https://stackoverflow.com/questions/17299951/c-vector-what-happens-whenever-it-expands-reallocate-on-stack)「ボンネットの下で」何が起こるかを説明します。 'std :: vector'に要素を追加するときです。はい、これを避けるために 'std :: list'を使うことができますが、それは問題を回避するだけです。なぜこれが最初に起こっているのかを理解する方が良いです。そうすれば、異なる標準ライブラリコンテナ。 – CoryKramer
私は理解していますが、データ構造のコースでは、償却分析を使用して、そのサイズが(2^i)、毎回の複雑さがO(1)であるときにベクトルを拡張すると学びました。 C++で "realloc()"を使用している - 私は自分のコードを書いたときに深く考えなかった。私はあなたがその特定のreallocを意味することを確かめるために最後のコメントの質問をしました – SomethingSomething