一步步调试,终于发现了创建对象的坑。
new对象相当于全局吧,总之new出来的对象不手动去释放,内存是一直占在那的。我做个链表,想的不用new,不用自己去手动释放内存方便点,结果就进了大坑!
while (ptemp != NULL)
{
if (ptemp->Key == oldV)
{
ListNode newTemp(newV);
cout << &newTemp << endl;
newTemp.pNext = ptemp->pNext;
ptemp->pNext = &newTemp;
break;
}
else
ptemp = ptemp->pNext;
}
就是这段代码,我想的newTemp是自己创的局部变量,这个对象每次都是新的,结果在VS2019上调试,一步步发现,原来每次新建的newTemp居然是一个地址!!因为链表里已经加入了之前的newTemp的这个地址,这直接导致链表发生错误,就一个地址,然后指向自己去了……死循环!
所以意识到,链表这种东西真不能交给系统去分配,特别是你要加入链表去的对象的申请,申请出来就是个内存,交给系统的话,很可能就被回收了你还不知道,并且新建的可能就跟以前的地址重复了。