如何在执行对象列表时处理动态分配?
我必须实现一个看起来像这样的功能:如何在执行对象列表时处理动态分配?
MyList * sum (MyList * l1, MyList * l2) {
MyList * newlist = new MyList();
//Adds two objects and place the result in a third new list
return newlist;
}
功能了两个列表,并放置每个对象的总和到一个新的列表。 MyList
类的节点指向next
变量,列表中的对象是用户定义的。
而这让我想 - 我应该如何处理对象和列表本身的内存动态分配?因为我必须为新列表的每个对象创建内存。
有什么办法放置在新的列表对象的总和的值,而不必依赖于动态分配?也许做这样的事情:
Object result(node1->content + node2->content);
Node->content = &result; // will this object be erased when the function ends?
,而不是这样的:
Node->content = new Object(node1->content + node2->content);
我应该如何应对关系函数内创建的,将持有的变量的新名单的寿命函数结束后的内存?返回新列表时,我可以做这样的事吗?
MyList & sum (MyList * l1, MyList * l2) {
//Create variable without allocating memory and return it's reference
}
总之,我的主要疑问是如何处理这是一个函数内部产生,并会被其他对象举行的对象的生命周期。
Object result(node1->content + node2->content); Node->content = &result; // will this object be erased when the function ends?
是,如果函数体内被创建与上文所示的语法result
,当函数结束它会被破坏。
这就是为什么你应该使用new
和动态分配的原因:在这种方式,在堆(而不是本地函数栈)创建的对象,在他们“生存”的功能结束它们被创建。你可以将返回的指针传回给调用者。当然,调用者必须正确地delete
返回的指针,否则你最终有内存(或其他资源)泄漏。
在现代C++,你应该使用已定义智能指针类,像std::shared_ptr
或std::unique_ptr
,你的代码应该几乎从来不使用明确new
和delete
(除非你正在开发一些自定义的高度优化的数据结构,并且您需要对内存分配进行低级细粒度控制 - 即使在这种情况下,调用new
和delete
的显式代码也应该安全地包装在RAII类边界内)。
但是,在我看来,你的代码更像是一个编程练习,而且这个练习的目的可能是通过显式的new
和delete
来学习动态内存分配。实际上,在生产质量代码中,您可以使用已有的标准链表类模板,如std::list
,而不是滚动自己的列表类。
Node->content = &result; // will this object be erased when the function ends?
是的,因为它是一个局部变量。一旦它的功能终止,result
的生命也一样。
MyList & sum (MyList * l1, MyList * l2) {
//Create variable without allocating memory and return it's reference
}
这将失败过,出于同样的原因如上述。
我建议你使用std::shared_ptr
或std::unique_ptr
。如果您愿意,请阅读Differences between unique_ptr and shared_ptr。
你有没有考虑过'std :: shared_ptr' /'std :: unique_ptr'? –
使用'std :: list'。 'std :: list'自动为你管理内存。 –
呃,为什么有人会坚持这个功能签名... – HolyBlackCat