我正在使用Qt5在c++中编写一个视频抓取应用程序。我遵循了他们的示例代码,并查看了获取相机信息的文档:http://doc.qt.io/qt-5/qcamerainfo.html
我遇到的问题是,在我使用规定的技术获取相机数据(它工作得很好)之后:
QList<QCameraInfo>cameraInfos = QCameraInfo::availableCameras();每当cameraInfos超出范围时,我就会得到一个Access violation错误。
例如,如果我这样做:
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)。
发布于 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()。
// 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();
}发布于 2016-06-08 09:52:04
因此,在遵循Kuba的建议并使用新构建的Qt库在我的环境中运行他的测试程序后,我得到了相同的错误。然后我有了一个聪明的主意,用release模式而不是debug模式运行它。瞧,它完美地工作了,无论是新构建的Qt5 (碰巧是x86)还是从Qt的下载页面获得的预构建的二进制文件(64位)。
似乎是链接到qt debug库导致了这种行为。我现在正在调试模式下链接到非调试库,我很高兴--在很大程度上--我仍然有点恼火,因为带'd‘后缀的qt库似乎不能在我的系统上正常工作。不过,我可以继续开发这个项目。
感谢所有的评论和回复!
https://stackoverflow.com/questions/37603946
复制相似问题