让我先描述下……实现这样一个方法,删除不带头单链表中与val值相同的结点方法签名:ListNode*removeElements(ListNode*head,intval);ListNode类声明classListNode{public:ListNode(intx):val(x),next(NULL){}intval;ListNode*next;};逻辑很简单,当//...pre->next=p->next;//...之后,一般的做法是deletep;但这时,有个问题。当主调函数中写如下调用时,会出内存问题ListNoden0(0),n1(1),n2(2);n0.next=&n1;n1.next=&n2;//...removeElements(&n0,2);n2结点的内存是不可delete的……另外,如果在removeElements方法中不写delete逻辑,如果主调函数中,链表结点是new出来的,则不delete会内存泄露So…我想问一下,在实现类似的C++函数时,有什么一般的做法,或者业内默认规定?或者,有没有更nice的处理方式?能让方法比较安全且避免内存泄露多谢:-)
2 回答
暮色呼如
TA贡献1853条经验 获得超9个赞
既然有ListNode,就应该有List类,将removeElements封装到List类中,由List类负责内存的分配和释放;这样责任就清晰了。再就是结点的分配一般都是在堆上申请,在栈上连接起来的结点当然无法删除;如果非得需要按照你这样的实现,在栈上应用list,那么只用更改结点指针就好了,不用delete,栈上的即结点在退出程序逻辑范围时自动删除了;
墨色风雨
TA贡献1853条经验 获得超6个赞
最不动脑子的方法,用shared_ptr,当然在你这个问题中这样显得有点傻。所以你应该把所有要删除的节点放到另外一个list里,等到真的不用的时候统一删掉就好。
添加回答
举报
0/150
提交
取消