Qlist <qcamerainfo>导致QList析构函数中的访问冲突

时间:2016-06-02 23:56:03

标签: c++ qt memory

我正在使用Qt5在c ++中编写视频抓取应用程序。我正在关注他们的示例代码并查看获取相机信息的文档: http://doc.qt.io/qt-5/qcamerainfo.html

我遇到的问题是,在使用规定的技术获取相机数据(效果很好)之后:

QList<QCameraInfo>cameraInfos = QCameraInfo::availableCameras();

每当Access violation超出范围时,我都会收到cameraInfos错误。

例如,如果我这样做:

void readDeviceInfo(void) {

    // Camera devices:
    QList<QCameraInfo>cameraInfos = QCameraInfo::availableCameras()
    for (QList<QCameraInfo>::Iterator it = cameraInfos.begin();
    it != cameraInfos.end(); ++it)
        std::cout << it->description().toStdString().c_str() << std::endl; 


}

此函数返回时发生崩溃。如果我这样做:

foreach(const QCameraInfo &ci, QCameraInfo::availableCameras());

在foreach循环的评估中发生崩溃。同样,如果我将QList<QCameraInfo> cameraInfos声明为类中的字段,则会在类被销毁时发生崩溃。这由我的调用堆栈的输出验证:

    ntdll.dll!000000007750eef1()    Unknown
    kernel32.dll!00000000773c1a0a() Unknown
>   VideoCapture.exe!free(void * pBlock) Line 51    C
    VideoCapture.exe!QCameraInfo::`scalar deleting destructor'(unsigned int)    C++
    VideoCapture.exe!QList<QCameraInfo>::node_destruct(QList<QCameraInfo>::Node * from, QList<QCameraInfo>::Node * to) Line 484 C++
    VideoCapture.exe!QList<QCameraInfo>::dealloc(QListData::Data * data) Line 857   C++
    VideoCapture.exe!QList<QCameraInfo>::~QList<QCameraInfo>() Line 817 C++

我正在使用Visual Studio 2013(很明显是Windows)。

2 个答案:

答案 0 :(得分:1)

您需要自己编译Qt,然后在调试器下运行测试用例并查看它崩溃的位置。您还需要一个最小的,自包含的测试用例 - 这必须是问题的一部分(SSCCE)。事实上,你更有可能在其他地方破坏内存,你看到的失败是堆损坏的结果,而不是Qt错误。

补充工具栏:您需要精通在Qt Creator中运行小例子。可以说,Qt Creator附带的模板并不是很好。你可以use this template作为其他项目 - &gt;简单的qmake,来制作快速原型。

以下在OS X 10.9和Windows 10 / VS 2015上使用当前Qt上的1个摄像头可以正常工作。您使用的std::cout是红色鲱鱼,您可以使用qDebug()作为好。

// https://github.com/KubaO/stackoverflown/tree/master/questions/camlist-37603946
#include <QtWidgets>
#include <QtMultimedia>

int main(int argc, char ** argv) {
   QApplication app{argc, argv};
   QComboBox combo;
   QObject::connect(&combo, &QComboBox::currentTextChanged, [&]{
      std::cout << combo.currentText().toStdString() << std::endl;
   });
   for (auto const & info : QCameraInfo::availableCameras())
      combo.addItem(info.description());
   combo.show();
   return app.exec();
}

答案 1 :(得分:0)

因此,在遵循Kuba的建议并在我的环境中使用新构建的Qt库运行他的测试程序之后,我得到了相同的错误。然后我有一个明智的想法是以release模式而不是debug运行它。瞧,它工作得很好,新建的Qt5(x86,发生了)和预先构建的二进制文件(64位)来自Qt的下载页面。

似乎链接到qt debug库导致了这种行为。我现在在调试模式下链接到非调试库并且很高兴 - 在大多数情况下 - 我仍然有点恼火的是,带有'd'后缀的qt库似乎无法正常工作我的系统。不过,我可以继续开发这个项目。

感谢所有评论和回答!