谁分配的谁释放。
题目中的指针不是你分配的,如果你释放了,题目要判错。
即便面试的时候,释放了不是你自己分配的指针也是要扣分的。
因为释放了不是自己分配的指针可能会导致双重释放。
在你给出的截图中的代码里,ListNode 删除后不 delete 没有任何问题。
首先,这个 ListNode 不是你 new 出来的;你也不知道链表整体的实现;你不知道 ListNode 是不是由这个链表全权管理的;你也不知道你所写的 removeElements 函数是否真的是一个 ListNode 的生命周期的结束。
因此,你不能 delete 这个 ListNode - 如果它在别的地方还要用呢?从链表中删除,并不意味着这个对象不再有存在的必要。最好的方法,是谁 new 的,让谁 delete. 你既然没有被要求管理 ListNode 对象的生命周期,就最好不要主动来做这件事情。(当然,很多时候,你不做,我不做,最后就泄露了 2333)
其次,你甚至不知道这个 ListNode 能不能被 delete - 它有可能根本不是开在堆上面的,也就是说,它根本不是 new 出来的。C++ 允许我们像这样直接在栈上创建对象,而不需要使用 new:
// 对象开在栈上,不能被 delete ListNode n = ListNode(1); // 对象开在堆上,需要被 delete ListNode *p = new ListNode(1);
在这个题目里,你并不能确定这一点,因此也就不能去 delete 它。
除了已经被反复强调的答案之外,一个被很多答主有意无意间忽略的事情是,正确的答案不仅仅是「不需要」delete,甚至应该是「不应当」delete,至少在题主给出的例子里是这样。
原因在于,入口函数只是提供了一个指针变量,并没有告诉你这个指针是从何而来,它即可能是被构造在栈上,也可能是通过 malloc 等方式在堆上构造。在这两种情况下,使用 delete 都会引发未定义行为,而未定义行为的危害比内存泄露可大多了。
本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度,google,bing,sogou 等
© 2025 tinynews.org All Rights Reserved. 百科问答小站 版权所有