我正在制作红黑树实施,目前正在测试'转储'功能。
此函数是树的有序遍历,它将树中的每个元素保存到动态数组中,并返回指向该数组的指针。
调试后我发现函数正常工作,数组包含它应该的元素。但是当测试函数试图'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 :(得分: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)
的另一个内存地址分配将丢失{{ 1}}。
请记住delete
你拥有的new
,这是一个很好的编程习惯。