【发布时间】:2016-06-29 19:28:29
【问题描述】:
我正在尝试获取插入我计算机的网络摄像头的名称并将它们推入组合框,然后稍后访问该名称。这是我的代码:
#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();
}
代码创建并显示一个组合框,其中包含我已插入计算机的网络摄像头的名称。然后它会在尝试将组合框字符串打印到控制台时向我抛出访问冲突异常。
如果我将 cout 行注释掉,一切都很好,但在退出时我得到一个 Debug Assertion Failed!留言:
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。
【问题讨论】:
-
您的编译器版本是否使用 Qt 二进制文件?由于有超过 1 个 CRT + 标准库不兼容,为任何其他版本的 Visual Studio 构建的二进制文件将出现 UB/堆损坏。
-
我想是的。 Qt5Multimedia.dll 位于目标文件夹中。 x64。
-
也许我应该从源代码构建。我从 sourceforge 下载了它们。我想我可能得到了正确的版本。我会查的。你所说的与我所经历的行为一致。
-
我仔细检查过,我很确定我使用的是用 msvc2013 构建的 Qt。
-
我可以确认您的代码 sn-ps(带有
std::cout和不带std::cout)在此处执行和退出时没有任何错误,使用带有 MinGw 32 位的 Qt 5.6,MSVC2013 32 位和 MSVC2013 64 位套件。正如@drescherjm 所指出的,我认为您使用的Qt 二进制文件存在问题。 . .