我遇到一段代码,它使用 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()
返回指向列表中第二个对象的指针,
这是指向动态内存的指针。
我的问题是:
my_list
是普通指针还是指向动态内存的指针?我们如何确定my_list
的类型。例如,如果我编写以下代码ListNode l1(2);ListNode* my_list = &l1;
那么 my_list
将是指向 ListNode 对象的普通指针。这两种情况有什么区别?
列表中的最后 5 个对象是使用
new
创建的,如何在使用列表后在main()
中删除它们?是否必须遍历列表,从列表末尾开始删除,直到删除所有动态创建的对象?如果那样的话,我觉得会比较麻烦和不方便。如何改进
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/