首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Qlist<QCameraInfo>导致QList析构函数中的访问冲突

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

Stack Overflow用户
提问于 2016-06-03 07:56:03
回答 2查看 737关注 0票数 1

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

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

代码语言:javascript
复制
QList<QCameraInfo>cameraInfos = QCameraInfo::availableCameras();

每当cameraInfos超出范围时,我就会得到一个Access violation错误。

例如,如果我这样做:

代码语言:javascript
复制
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; 


}

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

代码语言:javascript
复制
foreach(const QCameraInfo &ci, QCameraInfo::availableCameras());

崩溃发生在foreach循环的计算过程中。同样,如果我在一个类中声明QList<QCameraInfo> cameraInfos为一个字段,那么当这个类被销毁时就会崩溃。我的调用堆栈的输出验证了这一点:

代码语言:javascript
复制
    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)。

EN

回答 2

Stack Overflow用户

发布于 2016-06-07 21:31:27

你需要自己编译Qt,然后在调试器下运行你的测试用例,看看它在哪里崩溃。为此,您还需要一个最小的、自包含的测试用例--这必须是问题(SSCCE)的一部分。实际上,更有可能的情况是,您在其他地方损坏了内存,您看到的故障是由损坏的堆造成的,而不是Qt bug。

侧边栏:您需要精通在Qt Creator中运行小示例。可以说,Qt Creator附带的模板对此并不是很好。你可以像其他项目一样使用use this template ->Simple qmake,来制作快速原型。

在OS X 10.9和Windows 10/VS 2015上,当前Qt上的1个摄像头对我来说都很好用。您正在使用的std::cout是转移注意力的,您也可以使用qDebug()

代码语言:javascript
复制
// 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
EN

Stack Overflow用户

发布于 2016-06-08 09:52:04

因此,在遵循Kuba的建议并使用新构建的Qt库在我的环境中运行他的测试程序后,我得到了相同的错误。然后我有了一个聪明的主意,用release模式而不是debug模式运行它。瞧,它完美地工作了,无论是新构建的Qt5 (碰巧是x86)还是从Qt的下载页面获得的预构建的二进制文件(64位)。

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

感谢所有的评论和回复!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37603946

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档