【发布时间】:2016-06-02 23:56:02
【问题描述】:
我正在使用 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)。
【问题讨论】:
-
你有
QApplication实例化吗? -
是的。主应用程序是此窗口的父应用程序。这个想法是在 gui 的主窗口部分中按下按钮时实例化一个 videopanle 对象。您可能是正确的,视频面板缺少一些基础设施。我不太清楚添加它的正确方法。
-
如您所见,它的基类是 QWidget(我注意到它没有 exec() 方法)。这应该是别的什么吗?
-
错误似乎与环境不符,很难猜出到底缺少什么。尝试创建
QList<int>,会不会崩溃?还要在 main 中运行您的最小代码,看看它是否有效 -
@Alexey 感谢您的出色建议!不幸的是, QList
工作正常。我尝试在 main 中创建 QList 并在退出时遇到同样的崩溃。