如何在执行对象列表时处理动态分配?

问题描述:

我必须实现一个看起来像这样的功能:如何在执行对象列表时处理动态分配?

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 
} 

总之,我的主要疑问是如何处理这是一个函数内部产生,并会被其他对象举行的对象的生命周期。

+7

你有没有考虑过'std :: shared_ptr' /'std :: unique_ptr'? –

+6

使用'std :: list'。 'std :: list'自动为你管理内存。 –

+0

呃,为什么有人会坚持这个功能签名... – HolyBlackCat

Object result(node1->content + node2->content); 
Node->content = &result; // will this object be erased when the function ends? 

是,如果函数体内被创建与上文所示的语法result,当函数结束它会被破坏。

这就是为什么你应该使用new和动态分配的原因:在这种方式,在(而不是本地函数栈)创建的对象,在他们“生存”的功能结束它们被创建。你可以将返回的指针传回给调用者。当然,调用者必须正确地delete返回的指针,否则你最终有内存(或其他资源)泄漏。

在现代C++,你应该使用已定义智能指针类,像std::shared_ptrstd::unique_ptr,你的代码应该几乎从来不使用明确newdelete(除非你正在开发一些自定义的高度优化的数据结构,并且您需要对内存分配进行低级细粒度控制 - 即使在这种情况下,调用newdelete的显式代码也应该安全地包装在RAII类边界内)。

但是,在我看来,你的代码更像是一个编程练习,而且这个练习的目的可能是通过显式的newdelete来学习动态内存分配。实际上,在生产质量代码中,您可以使用已有的标准链表类模板,如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_ptrstd::unique_ptr。如果您愿意,请阅读Differences between unique_ptr and shared_ptr