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

标签 c++ pointers new-operator delete-operator

我遇到一段代码,它使用 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;
  }
}

关于c++ - 从主函数中删除在另一个函数中使用 new 创建的一系列对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44850641/

相关文章:

c# - 在完全初始化结构之前访问结构的字段

c++ - 使用浮点文字调用重载函数会产生 'ambiguos' 错误

C++ `operator function_type()` 这样的事情可能吗?

c++ - reverse_iterator 适配器

c++ - 如果 stdafx.h 中已包含特定 header - 我是否需要(必须/应该)将其显式包含在 .cpp 文件中?

c++ - OpenMP 和智能指针

c++ - 错误。表达式必须有类类型

c++ - 对象数组初始化 (C++)

pointers - 使用 xlsx 包 panic : runtime error: invalid memory address or nil pointer dereference Go

c++ - 为什么我们应该重载/覆盖新的和删除?