我尝试访问动态数组时代码中断。打开malloc.c

时间:2013-07-19 02:08:31

标签: arrays tree heap red-black-tree

我正在制作红黑树实施,目前正在测试'转储'功能。

此函数是树的有序遍历,它将树中的每个元素保存到动态数组中,并返回指向该数组的指针。

调试后我发现函数正常工作,数组包含它应该的元素。但是当测试函数试图'cout'数组的第一个元素时,我得到了

Assignment4.exe has triggered a breakpoint.

后面跟malloc.c开放:

__forceinline void * __cdecl _heap_alloc (size_t size)

{

    if (_crtheap == 0) {
        _FF_MSGBANNER();    /* write run-time error banner */

        _NMSG_WRITE(_RT_CRT_NOTINIT);  /* write message */
        __crtExitProcess(255);  /* normally _exit(255) */
    }

→    return HeapAlloc(_crtheap, 0, size ? size : 1);
}

所以这里的代码可能是罪魁祸首:

功能:

int* /*T*/ RedBlackTree::dump(int& number)
{
    int* /*T*/ arr = new int(n);
    number = 0;

    inOrder(root, arr, number);

    return arr; //returns pointer to entire tree in ascending order
}

void RedBlackTree::inOrder(Node* nd, int* /*T*/ arr, int& num)
{
    if(nd != NULL)
    {
        inOrder(nd->left, arr, num);
        arr[num] = nd->data;
        num++;
        inOrder(nd->right, arr, num);
    }

}

测试功能:

int main()
{
    RedBlackTree tree;

    //insert test
    tree.insert(15);
    tree.insert(20);
    tree.insert(20);
    tree.insert(21);
    tree.insert(48);
    tree.insert(18);
    tree.insert(1);
    tree.insert(7);
    tree.insert(25);

    //dump test
    int* arr = new int(tree.size());
    int n = 0;
    arr = tree.dump(n);

    for(int i = 0; i < n; i++)
    {
→       cout << arr[i] << " ";
    }

    return 0;
}

我在触发错误的行上放了一个箭头。

我使用调试器检查并快速观察在执行该行之前数组中是否存在i = 0到i = 8的每个元素。

谢谢大家的帮助!

1 个答案:

答案 0 :(得分:0)

int* arr = new int(tree.size());
int n = 0;
arr = tree.dump(n);

这是问题所在。

首先使用arr将数组分配给tree.size(),看起来不错。但是,在tree.dump(n)内,您已分配了另一个大小为n的数组,并返回arr。此时,arr实际上是一个大小为n的数组,在您的情况下为0。访问此阵列应该是非法的。

另一方面,如果以这种方式编写,它将导致内存泄漏,即arr指向的原始内存将丢失,arrtree.dump(n)的另一个内存地址分配将丢失{{ 1}}。

请记住delete你拥有的new,这是一个很好的编程习惯。