2016-06-29 6 views
0

私のコンピュータに接続されているWebカメラの名前をつかみ、コンボボックスに押し込んで後で名前にアクセスしようとしています。私のコードは次のとおりです。camerainfoと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(); 


} 

このコードは、コンピュータに接続したWebカメラの名前を持つコンボボックスを作成して表示します。コンボボックスの文字列をコンソールに出力しようとすると、アクセス違反の例外が表示されます。

私がcoutの行をコメントアウトすると、すべて正常ですが、終了時にデバッグアサーションが失敗します!メッセージ:

Expression: _BLOCK_TYPE_IS_VALID(pHead->nBlockUse) 

私は削除されたオブジェクト(コンボボックスのQString ???)を削除しようとしています。

私はダミーとのコンボボックスを埋めるためのコードを変更した場合:

#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(); 


} 

を私はCOUTに同じエラーを取得しますが、私はその行をコメントアウトした場合、アプリケーションが正常に終了します。私はVisual Studio 2013、Windows 7、およびQt5を使用しています。

+0

コンパイラのバージョンにQtバイナリを使用していますか? Visual Studioの他のバージョン用に構築されたバイナリには、CRT +標準ライブラリの互換性が1つ以上ないため、UB /ヒープの破損が発生します。 – drescherjm

+0

そうだと思います。 Qt5Multimedia.dllがターゲットのフォルダにあります。 x64。 – dmedine

+0

おそらく私はソースからビルドする必要があります。私はsourceforgeからダウンロードしました。私はおそらく正しいバージョンを持っていると思う。私がチェックします。あなたが言うことは、私が経験している行動と一致しています。 – dmedine

答えて

0

これで機能します。私は同じソースコードを保持していましたが、既存のプロジェクトを完全に廃止し、ゼロから新しいものを開始しました。

ランタイムライブラリフラグをマルチスレッドDLLデバッグに設定すると、アクセス違反エラーが発生することがわかりました。マルチスレッドDLLに設定しても問題ありません。

他のプロジェクト設定が寄与している可能性がありますが、これが主な原因です。

関連する問題