5

有时我在调试模式下运行我的 Qt 项目时遇到“调试断言失败”错误(图像)。我不知道我错在哪里,因为编译器什么也没说,我不知道该怎么做才能找到我的错误。

我在 Windows Vista 下编程,使用 Qt Creator 2.4.1、Qt 4.8.1。

我的程序必须从激光设备中读取一些信息并将它们保存到一个文件中,其代码类似于:

void runFunction()
{
    configure_Scanning(...);

    while(...)
    {
        // do something
        scanFunction();
        // do something
    }
}

这是我的“有罪”功能(我认为问题出在哪里)

void scanFunction()
{
    file.open();

    data = getDataFromDevice();

    if(flag)
    {
        if(QString::compare(lineB,"")!=0)
        {
            QTextStream out(&file);
            out << lineB << endl;
            lineB = "";
        }
        lineA.append(data+"\t");
    }
    else
    {
        if(QString::compare(lineA,"")!=0)
        {
            QTextStream out(&file);
            out << lineA << endl;
            lineA = "";
        }
        lineB.prepend(data+"\t");
    }

    file.close();
}

其中lineAlineB最初是两个 void QString:想法是我进行双向扫描以将信息保存在 2D 矩阵中(从 -X 到 +X,反之亦然,而 Y 转到指定的目标)。lineA记住 (-) 到 (+) 的读数;lineB记住 (+) 到 (-) 的读数。当扫描方向改变时,我将lineA(或lineB)写入文件并继续扫描。

你明白我说的话吗?你能给我一个解决方案吗?

谢谢和对不起我的英语:P

4

2 回答 2

11

_CrtIsValidHeapPointerUserData 意味着,你有一个堆损坏,这是由调试堆检查器注意到的。怀疑每个可以将任何信息写入任何已删除动态对象的人。是的,您不会在重写发生时立即收到堆损坏,而是在下一次堆检查时收到堆损坏,这将在任何下一次内存分配/释放时执行。然而,应该由单线程应用程序中的调用堆栈简单地跟踪。

于 2012-05-30T19:37:09.140 回答
0

在我们的例子中,该程序在 DEBUG 模式下完美运行,并在 RELEASE 模式下因类似的错误跟踪而崩溃。

就我而言,RELEASE 模式在链接器定义中有 msvscrtd.dll。我们删除了它并解决了问题。

或者,将 /NODEFAULTLIB 添加到链接器命令行参数也解决了该问题。

于 2020-10-30T18:09:04.930 回答