2017-05-09 4 views
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) 

これは次のように、それがどのように見えるかです。それはすぐにベクトルに割り当てられていましたが、スタックから拭き取られたときにループが終了したときに実際に破棄された可能性はありますか?

答えて

2

実際には、ループ内でpush_backを呼び出しているため、再割り当てが発生する可能性があります。そのような場合は、基礎となるデータがコピーされるので、ポインタや参照は無効になります。

一つの方法は、配列前もって

std::vector<cv::Mat> images(10); 
for (int i = 0 ; i < 10 ; i++) { 
    images[i] = cv::Mat(/* bla bla */); 
    cv::Mat& mat = images.at(i); 
    std::thread(some_function_name, &mat) 
} 
// Wait here for all threads to join (didn't show its code) 
+0

の大きさになり、これを解決するには、あなたが実際に時々起こる 'vector'の自己拡張操作がそれを引き起こすことを言うのですか?ですから、代わりに 'std :: list'を使用すると、それは防止されますか? – SomethingSomething

+1

@SomethingSomething [この記事を読む](https://stackoverflow.com/questions/17299951/c-vector-what-happens-whenever-it-expands-reallocate-on-stack)「ボンネットの下で」何が起こるかを説明します。 'std :: vector'に要素を追加するときです。はい、これを避けるために 'std :: list'を使うことができますが、それは問題を回避するだけです。なぜこれが最初に起こっているのかを理解する方が良いです。そうすれば、異なる標準ライブラリコンテナ。 – CoryKramer

+0

私は理解していますが、データ構造のコースでは、償却分析を使用して、そのサイズが(2^i)、毎回の複雑さがO(1)であるときにベクトルを拡張すると学びました。 C++で "realloc()"を使用している - 私は自分のコードを書いたときに深く考えなかった。私はあなたがその特定のreallocを意味することを確かめるために最後のコメントの質問をしました – SomethingSomething

関連する問題