我应该将 malloc() 用于链表吗?

Should I be using malloc() for a linked-list?

我已经有好几年没有使用 C++ 了,而且我也从未正确了解内存分配和垃圾收集的工作原理。我一直在看视频并试图找到可以学习的资源,但我在作业中得到了指导,但我不确定如何解释我需要做的事情。

指令是"If there is not enough memory left to create a new object, the function should return false; otherwise the function returns true"

这是否意味着我应该使用 malloc() 或是否有另一种检查内存是否已满的方法?

此外,如果有人知道有关该主题的好指南...

在 C++ 中,您通常不应使用 malloc;它更像是一个 C 函数,与 C++ 范例不太吻合。

相反,您应该使用 C++ 自己的技术来管理内存,例如 newdeletenew 优于 malloc 的好处是 new 将在构造函数的帮助下正确初始化对象,而不是简单地给你一个内存区域,你需要在其中仔细构造一个对象 in-place。同样,delete 将正确调用对象的析构函数(而 free 不会)。

假设你的链表节点class/struct被称为Node,表达式new Node将为一个节点分配内存,return一个指向该节点的指针;如果内存不可用,将尽力尝试抛出异常(std::bad_alloc)。

您可能想尝试 catch 它,但如果内存不足,您可能无能为力,因为打印错误消息等有用的操作本身可能需要分配内存。

进入内存分配并不是现代 C++ 的主要方法。我们一般倾向于使用std容器(vectorlistmap...)或者std智能指针——作为主要的解决方案;如果这不适用 and/or 需要自定义容器智能指针,则可以考虑 类 的 std::allocator 系列。只有最后一个选项是 new/delete 运算符。当您一直阅读这篇 post 到这里时,内存损坏的风险逐渐增加;如果你进一步深入挖掘,会出现严重危险的 C API 和 malloc/free 函数族,但这个函数远远超出了限制,除非在非常极端的情况下几乎不使用。