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

时间:2017-08-30 16:13:55

标签: 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;
}

该函数接受了两个列表,并将每个对象的总和放入一个新列表中。 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 
}

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

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

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,并且您的代码几乎不应该使用 explicit newdelete(除非您正在开发一些自定义的高度优化的数据结构,并且您需要对内存分配进行低级细粒度控制 - 即使在这种情况下,也需要显式代码调用newdelete应该安全地包含在RAII类边界内。)

但是,在我看来,您的代码更像是一个编程练习,本练习的目的可能是学习使用显式newdelete的动态内存分配。实际上,在生产质量代码中,您可以使用已经可用的标准链表类模板,而不是滚动自己的列表类,例如std::list

相关问题