实现对象列表时如何处理动态分配?

Edu*_*edo 6 c++ pointers memory-management dynamic-allocation dangling-pointer

我必须实现一个看起来像这样的函数:

MyList * sum (MyList * l1, MyList * l2) {
    MyList * newlist = new MyList();
    //Adds two objects and place the result in a third new list
    return newlist;
}
Run Code Online (Sandbox Code Playgroud)

该函数采用了两个列表,并将每个对象的总和放入一个新列表中.所述MyList类曾与指针指向节点next可变的,并且该列表内的对象的用户定义被.

这让我思考 - 我该如何处理来自对象和列表本身的动态内存分配?因为我必须为新列表的每个对象创建内存.

有没有办法将对象总和的值放在新列表中而不必依赖动态分配?也许做这样的事情:

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

而不是这个:

Node->content = new Object(node1->content + node2->content);
Run Code Online (Sandbox Code Playgroud)

我应该如何处理函数内部创建的新列表的生命周期,该函数将在函数结束后保存内存的变量?返回新列表时,我可以这样做吗?

MyList & sum (MyList * l1, MyList * l2) {
    //Create variable without allocating memory and return it's reference 
}
Run Code Online (Sandbox Code Playgroud)

简而言之,我的主要疑问是如何处理在函数内创建的对象的生命周期,并将由其他对象持有.

Mr.*_*C64 0

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

是的,如果result使用上面所示的语法在函数体内创建,它会在函数结束时被销毁。

new这就是您应该使用动态分配的原因:通过这种方式,您的对象是在(而不是本地函数堆栈)上创建的,并且它们在创建它们的函数末尾“存活”。并且您可以将返回的指针传递回调用者。当然,调用者必须正确处理delete返回的指针,否则最终会导致内存(或其他资源)泄漏。

在现代 C++ 中,您应该使用已经定义的智能指针类,例如std::shared_ptror std::unique_ptr,并且您的代码几乎不应该使用显式的 newand delete(除非您正在开发一些自定义的高度优化的数据结构,并且您需要对内存分配 - 即使在这种情况下,显式调用 和 的代码newdelete应该安全地包装在 RAII 类边界内)。

然而,在我看来,你的代码更像是一个编程练习,这个练习的目的可能是学习使用显式 和 的动态内存new分配delete。事实上,在生产质量代码中,您可以使用现有的标准链接列表类模板,而不是滚动自己的列表类,例如std::list.