2016-06-29 8 views
0

Ich versuche, die Namen der Webcams in meinem Computer eingesteckt und schieben Sie sie in eine Combobox, dann den Namen später zugreifen. Hier ist mein Code:qt Speicherprobleme mit camerainfo und combobox.currentText()

#include <QApplication> 
#include <QComboBox> 
#include <QCameraInfo> 
#include <iostream> 

int main(int argc, char *argv[]) 
{ 


    QApplication app{ argc, argv }; 
    QComboBox combo; 
    QList<QCameraInfo> info = QCameraInfo::availableCameras(); 

    foreach(QCameraInfo i, info) 
     combo.addItem(i.description()); 
    combo.show(); 

    std::cout << combo.currentText().toStdString() << std::endl; 
    return app.exec(); 


} 

Der Code erstellt und zeigt ein Kombinationsfeld, das den Namen einer Webcam hat, dass ich in an den Computer angeschlossen haben. Es wirft dann eine Zugriffsverletzungsausnahme bei dem Versuch, die Kombinationsfeldzeichenfolge auf der Konsole zu drucken.

Wenn ich die cout-Linie out kommen, ist alles gut, aber beim Beenden bekomme ich eine Debug Assertion fehlgeschlagen! Nachricht:

Expression: _BLOCK_TYPE_IS_VALID(pHead->nBlockUse) 

, die ich mir zu löschen, ein Objekt zu bedeuten nehmen, die (das QString in der Combobox ???) gelöscht wurden.

Wenn ich den Code ändern, um die Combo-Box mit Attrappen zu füllen:

#include <QApplication> 
#include <QComboBox> 
#include <QCameraInfo> 
#include <iostream> 

int main(int argc, char *argv[]) 
{ 


    QApplication app{ argc, argv }; 

    for(int i=0; i<2; i++) 
     combo.addItem(QString("la la la"); 
    combo.show(); 

    std::cout << combo.currentText().toStdString() << std::endl; 
    return app.exec(); 


} 

Ich bekomme den gleichen Fehler auf dem cout, aber wenn ich diese Zeile aus kommentieren, die Anwendung beendet richtig. Ich verwende Visual Studio 2013, Windows 7 und Qt5.

+0

Verwenden Sie Qt-Binärdateien für Ihre Compiler-Version? Binärdateien, die für eine andere Version von Visual Studio erstellt wurden, weisen UB/Heap-Fehler auf, da mehr als 1 CRT + -Standardbibliotheksinkompatibilitäten bestehen. – drescherjm

+0

Ich denke schon. Qt5Multimedia.dll befindet sich im Ordner mit dem Ziel. x64. – dmedine

+0

Vielleicht sollte ich aus der Quelle bauen. Ich habe sie von Sourceforge heruntergeladen. Ich denke, dass ich wahrscheinlich die richtige Version gefunden habe. Ich werde überprüfen. Was Sie sagen, stimmt mit dem Verhalten überein, das ich erlebe. – dmedine

Antwort

0

Jetzt funktioniert es. Ich behielt den gleichen Quellcode, aber verwarf das vorhandene Projekt komplett und startete ein neues von Grund auf neu.

Ich habe festgestellt, dass wenn ich die Runtime-Bibliothek-Flag auf Multi-Threaded-DLL-Debug setzen, bekomme ich Zugriffsverletzung Fehler. Wenn ich es auf Multi-Threaded DLL setze, ist es in Ordnung.

Möglicherweise gab es andere Projekteinstellungen, die dazu beigetragen haben, aber dies scheint der Hauptschuldige zu sein.