从主函数中删除在另一个函数中使用 new 创建的一系列对象
delete a series of object created using new in another function from the main function
我遇到了一段代码,它使用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;
}
}
my_list是普通指针还是指向动态内存的指针?
你的指针是一个指针,它是一个指向内存的变量,指向动态分配的内存的指针和未动态分配的内存之间实际上没有区别。 唯一的区别是您必须清理您拥有的动态分配的内存。(您应该知道您是否动态分配了它(
动态内存的一个安全的替代方案是使用std::shared_ptr
和std::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::vector
或std::list
来执行当前正在执行的完全相同的操作。
- 通过构造函数创建的所有对象都具有相同的向量
- 通过构造函数创建一些值并尝试添加到文档中使用 rapidjson 不起作用
- 为 NewObjectA() 函数创建 jvalues 的参数数组时出错 - JNI Invocation API
- 使用带有 ref 参数的成员函数创建线程时出现编译错误
- C++ :: 如何捕获由 void 函数创建的矩阵
- 通过零参数构造函数创建的 glm::mat4 应该包含哪些值?
- 用于基于成员字段或函数创建比较器的快捷方式
- std::使用类成员函数创建线程 - 最佳实践
- 为C++重载函数创建SWIG类型映射
- 使用成员函数创建std::函数不会编译
- 如何为返回特定类型的函数创建 SWIG 类型图
- 为具有多个参数的函数创建 SWIG 类型图的更简单方法?
- 通过另一个宏创建的函数创建所有列表的宏
- std::map<int, A> 运算符 [] 需要使用空构造函数创建 A
- 无法使用 CreateWindowEx 函数创建窗口
- c++ 从成员函数创建新线程并移动对象和整个对象
- 无法使用 c++ 中的类成员函数创建/写入文件
- 使用makeword函数创建错误e0109-表观呼叫的括号前表达式必须具有(指针到 - )函数类型
- 为 OpenMP 函数创建别名 ||部分禁用 openMP
- 稍后使用<Class>调用类构造函数创建 std::vector