调试断言失败_crtisValidHeapPointer(块)

时间:2016-02-24 19:19:01

标签: c malloc realloc

我试图在c / c ++中实现快速排序,并且我不断收到此错误,"调试断言失败_crtisValidHeapPointer(block)"我随时运行代码。

我的代码是:

void QuickSort(int *A, int size) {
if (size < 2) return;
int *L = NULL, *R = NULL, RSize = 0, LSize = 0;

R = (int *)malloc(sizeof(int));
L = (int *)malloc(sizeof(int));

for (int i = 0; i < size; i++) {
    if (A[size - 1] <= A[i]) 
        if( ((int *)realloc(R, (sizeof(int) * (RSize + 2) ))) != NULL )
            R[RSize++] = A[i];
    else 
        if ( ((int *)realloc(L, (sizeof(int) * (LSize + 2) ))) != NULL )
            L[LSize++] = A[i];
}

    QuickSort(L, LSize);
    QuickSort(R, RSize);
    Merge(A, L, R, LSize, RSize);
    free(L);
    free(R);
    return;
}

我知道它与我的数组L和R的内存分配有关,但我似乎无法弄清问题究竟是什么。

编辑:找到解决方案

代码:

void QuickSort(int *A, int size) {
if (size < 2) return;
int *L = NULL, *R = NULL, RSize = 0, LSize = 0;

for (int i = 0; i < size; i++) {
    if (A[size - 2] < A[i]) {
        if ((R = (int *)realloc(R, (sizeof(int) * (RSize + 1)))) != NULL) 
            R[RSize++] = A[i];
    }
    else {
        if ((L = (int *)realloc(L, (sizeof(int) * (LSize + 1)))) != NULL) 
            L[LSize++] = A[i];
    }
}
     QuickSort(L, LSize);
     QuickSort(R, RSize);
     Merge(A, L, R, LSize, RSize);
     free(L);
     free(R);
     return;
}

2 个答案:

答案 0 :(得分:2)

嗯,仅对intL变量的单个R进行分配。但是稍后在代码中,您会分配许多整数,因为LSizeRSize会递增。好吧,我看到realloc已被调用,但结果未分配回LR,因此会导致问题。

无论如何,quicksort算法可以很好地处理原始数组,没有理由为它分配新的临时数组。

答案 1 :(得分:2)

问题在于:

if( ((int *)realloc(R, (sizeof(int) * (RSize + 2) ))) != NULL )
    R[RSize++] = A[i];

realloc函数返回新数组指针,与if内的NULL进行比较,然后丢弃。然后取消引用原始(无效)指针,破坏堆。

要修复,请务必将realloc的结果分配给指针。

if( (R = (int *)realloc(R, (sizeof(int) * (RSize + 2) ))) != NULL )

如果分配失败,您还应该包含一些错误检查以中止循环,以else语句的形式发送到此if。正如当前所写,如果realloc失败,那么循环将继续完成,在每次迭代时跳过数组,然后返回损坏的结果。