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
不存在了。是否有可能雖然它被立即分配給矢量,但是當循環結束時它實際上被銷燬了,因爲它被從堆棧上擦掉了?
你居然說發生不時原因吧'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