2017-05-09 31 views
0

我使用OpenCV構建了一個多線程系統,該系統創建一些圖像,將它們分配到一個矢量中,並將每個圖像發送到不同的線程中。將OpenCV矩陣分配到數據結構中

這是它的樣子:

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) 

看來,當線程獲得的指針Mat對象,該對象Mat不存在了。是否有可能雖然它被立即分配給矢量,但是當循環結束時它實際上被銷燬了,因爲它被從堆棧上擦掉了?

回答

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