2013-07-19 2 views
0

Я делаю реализацию Red Black Tree и в настоящее время тестирую функцию 'dump'.Кодовый разрыв при попытке доступа к динамическому массиву. Opens malloc.c

Эта функция представляет собой обход дерева в порядке, который сохраняет каждый элемент в дереве в динамический массив и возвращает указатель на этот массив.

После отладки я нашел, что функция работает правильно, и массив содержит элементы, которые он должен. Но когда тестовая функция пытается «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 существует в массиве непосредственно перед тем, как эта строка будет выполнена.

Спасибо вам за помощь!

+0

Пожалуйста, используйте тег [red-black-tree]. [red] - это язык программирования – kealist

ответ

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 будет потеряно дело другого назначения адресов памяти на arr с tree.dump(n).

И помните, что delete у вас есть new, это хорошая практика программирования.

+0

Отличные динамические массивы становятся неудобными, когда они передаются между функциями! – Fabio

Смежные вопросы