Ich erstelle ein Multithread-System mit OpenCV, das einige Bilder erstellt, sie einem Vektor zuordnet und jedes Bild in einen anderen Thread sendet.OpenCV-Matrix einer Datenstruktur zuweisen
Dies ist, wie es aussieht:
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)
Es scheint, dass, wenn der Thread bekommt den Zeiger auf das Mat
Objekt, das Mat
Objekt nicht mehr existiert. Ist es möglich, dass es, obwohl es dem Vektor sofort zugewiesen wurde, tatsächlich zerstört wurde, als die Schleife endete, als es vom Stapel gelöscht wurde?
zu groß sein Sagen Sie eigentlich, dass die Selbst Erweiterung Operationen des 'VECTOR' die Ursache es von Zeit zu Zeit auftreten? Wenn ich stattdessen "std :: list" verwende, würde das verhindert werden? – SomethingSomething
@SomethingSomething [Lesen Sie diesen Beitrag] (https://stackoverflow.com/questions/17299951/c-vector-what-happens-whene-re-expands-reallocate-on-stack) das erklärt, was passiert "unter der Haube" wenn Sie Elemente zu einem 'std :: vector' hinzufügen. Ja, Sie könnten eine 'std :: list' verwenden, um dies zu vermeiden, aber das würde nur das Problem vermeiden, es ist besser zu verstehen, * warum * das überhaupt vorkommt, damit Sie das Verhalten der verschiedenen Standardbibliotheken verstehen Behälter. – CoryKramer
Gut, ich habe gelernt, in "Data Structures" Kurs gelernt, dass mit Amortized Analysis, wenn Sie den Vektor jedes Mal erweitern, wenn seine Größe ist (2^i), dann ist Ihre durchschnittliche Komplexität O (1) - und ich verstehe, es ist getan in C++ mit "realloc()" - das habe ich beim Schreiben meines Codes nicht so genau gedacht. Ich habe die Frage im letzten Kommentar gestellt, nur um sicherzustellen, dass Sie zu diesem spezifischen realloc – SomethingSomething