从主函数中删除在另一个函数中使用 new 创建的一系列对象

delete a series of object created using new in another function from the main function

本文关键字:函数 创建 new 一系列 对象 另一个 删除      更新时间:2023-10-16

我遇到了一段代码,它使用new在函数中分配动态内存,然后在主函数中调用此函数。我怀疑存在一些内存泄漏问题,但我不知道如何解决它。以下代码经过简化以演示该问题:

#include <iostream>
#include <vector>
using namespace std;
// Definition for singly-linked list.
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
ListNode* createList(void);
int main(){
ListNode* my_list = createList();
//... some code 

//  how to delete those objects created by new?
return 0;
}
ListNode* createList(void) {
ListNode preHead(0), *p = &preHead;
vector<int> sum = {1, 2, 3, 4, 5};
for (decltype(sum.size()) i = 0; i != sum.size(); i++){
p->next = new ListNode(sum[i]);
p = p->next;
}
return preHead.next;
}

如果我理解正确,该函数createList()创建一个包含 6 个 ListNode 对象的列表。 除了列表中的第一个对象(preHead(,其他 5 个对象都是动态的 使用new分配。最后,函数createList()返回指向列表中第二个对象的指针, 它是指向动态内存的指针。

我的问题是:

  1. my_list是普通指针还是指向动态内存的指针?我们如何确定my_list的类型,例如,如果我编写以下代码

    ListNode l1(2);ListNode* my_list = &l1;

然后my_list将是指向ListNode对象的普通指针。这两种情况有什么区别?

  1. 列表中的最后 5 个对象是使用new创建的,使用列表后如何在main()中删除它们?我是否必须遍历列表并从列表末尾开始删除,直到删除动态创建的所有对象?

  2. 如果是这样的话,我认为这将是繁琐和不方便的。如何在createList()仍返回指向 ListNode 对象的指针的情况下改进它。

同意上述使用 std::list 的建议,我想添加以下内容: Q1( 您在哪里看到"普通指针"和"指向动态内存的指针"之间的区别?指向 x 的指针就是指向 x 的指针。您应该知道删除是否是您。 Q2(你要么按照你的建议去做(从最后删除(,要么

void clearList(ListNode* p) { 
ListNode* nextP; 
while (p != NULL) {
nextP = p.next;
delete p;
p = nextP;
}
}

my_list是普通指针还是指向动态内存的指针?

你的指针是一个指针,它是一个指向内存的变量,指向动态分配的内存的指针和未动态分配的内存之间实际上没有区别。 唯一的区别是您必须清理您拥有的动态分配的内存。(您应该知道您是否动态分配了它(

动态内存的一个安全的替代方案是使用std::shared_ptrstd::unique_ptr我不会在这里详细介绍,但它们可以为您节省内存管理方面的麻烦,因此请查找它们。

我们如何确定my_list的类型.例如,如果我写 以下代码

列表节点 l1(2(;ListNode* my_list = &l1;

这是指向堆栈上分配的内存的指针(因此不是动态的,因为您没有调用new(

列表中的最后 5 个对象是使用 new 创建的,如何删除 使用列表后,它们在 main(( 中?我必须遍历列表吗 并从列表末尾开始删除,直到创建所有对象 动态删除?

是的,如果您愿意,您可以遍历所有内容并以这种方式删除它们,但是您将如何到达上一个? 另一种解决方案是执行以下操作:

ListNode* tempPtr;
while(my_list)  // This works since you are initializing next to null.
{
tempPtr = my_list->next;
delete my_list;
my_list = tempPtr;
}

如果是这样的话,我认为这将是繁琐和不方便的。 如何在它仍然返回的条件下改进 createList(( 指向 ListNode 对象的指针。

真的没有,如果你不在这里动态分配内存或使用静态或全局变量,它将在函数结束时消失。 但是,您可以使用std::vectorstd::list来执行当前正在执行的完全相同的操作。