调试断言失败:_CrtIsValidHeapPointer(pUserData)

时间:2012-05-30 15:36:42

标签: c++ qt debugging assertion

有时我在调试模式(image)中运行我的Qt项目时出现“Debug Assertion Failed”错误。 我不知道我错在哪里,因为编译器没有说什么,我不知道如何找到我的错误。

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

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

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();
}

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

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

谢谢,对不起我的英文:P

2 个答案:

答案 0 :(得分:10)

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

答案 1 :(得分:0)

在我们的情况下,该程序在DEBUG模式下运行良好,并在RELEASE模式下崩溃并出现类似的错误跟踪。

就我而言,“释放”模式在链接器定义中包含msvscrtd.dll。我们将其删除,问题得以解决。

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