提问者:小点点

camerainfo和ComboBox.currentText()的qt内存问题


我正试图抓取插入我电脑的网络摄像头的名称,并将它们塞进一个组合框中,然后稍后访问该名称。下面是我的代码:

#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行注释掉,那么一切都很好,但是在退出时,我会得到一个调试断言失败!消息:

Expression: _BLOCK_TYPE_IS_VALID(pHead->nBlockUse)

这意味着我正在删除一个已经删除的对象(combox中的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。


共1个答案

匿名用户

现在起作用了。我保留了相同的源代码,但完全废弃了现有的项目,从头开始了一个新的项目。

我发现如果我将运行时库标志设置为多线程DLL调试,我将得到访问冲突错误。如果我将其设置为多线程DLL,就可以了。

可能有其他一些项目设置功不可没,但这似乎是罪魁祸首。