函数在发布模式下崩溃,但在调试器中运行完美

时间:2013-07-19 19:43:23

标签: c arrays memory-management allocation

我的程序在第7行崩溃了这个函数,当我在发布模式下运行时调用malloc()我得到`Program.exe已停止工作消息,当我在调试器中运行时,大多数它成功的时间,但有时我得到这个消息(特别是在较大的输入上): crash

MONOM* polynomialsProduct(MONOM* poly1, int size1, MONOM* poly2, int size2, int* productSize)
{
    int i1, i2;
    int phSize = 1, logSize = 0;
    MONOM* product;

    product = (MONOM*)malloc(phSize*sizeof(MONOM));
    monomAllocationVerification(product);

    for (i1 = 0; i1 < size1; i1++)
    {
        for (i2 = 0; i2 < size2; i2++)
        {
            if (logSize == phSize)
            {
                phSize *= 2;
                product = (MONOM*)realloc(product,phSize*sizeof(MONOM));
                monomAllocationVerification(product);
            }

            product[logSize].coefficient = poly1[i1].coefficient * poly2[i2].coefficient;
            product[logSize].power = poly1[i1].power + poly2[i2].power;
            logSize++;
        }
    }

    mergeSort(product,logSize);
    *productSize = sumMonomsWithSamePower(product, logSize);

    return product;
}

我知道我正在处理内存错误和问题,但有没有快速的方法来分析我的代码并查找内存错误?我查看我的代码十几次寻找这种错误并没有发现任何东西。 (我不想在这里发布代码,因为它长420行)。

2 个答案:

答案 0 :(得分:1)

首先,如果在第一个malloc上检测到堆损坏,则意味着它发生得更早(不在此函数中或在上一次传递中)。所以问题可能在于此代码之外。

然而,该代码对我来说也很可疑。

  1. monomAllocationVerification没有size参数,所以它应该仅适用于一个monom,但是在指向第一个元素的realloc之后只调用一次,尽管已分配很多君主的空间。请澄清你的决定。

  2. 有些不清楚为什么sumMonomsWithSamePower应该返回一个大小,因此修改一个数组来存储一个值。可能是一个怪癖,但仍然是可疑的。

  3. <强>更新

    问题在于其他功能;一些错误大小的reallocs。

答案 1 :(得分:0)

我会检查malloc()的返回值,并使用perror()来描述发生了什么错误。此处还有malloc()perror()的文档。

if((product = (MONOM*)malloc(phSize*sizeof(MONOM))) == NULL)
{
      perror("ERROR: Failed to malloc ");
      return 1;
      //perror() will display a system specified string to describe the error it may tell you the error
}

你也知道MONOM的大小吗?如果没有在代码中添加以下行。

printf("MONOM SIZE = %i\n", sizeof(MONOM));