我应该将 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++ 自己的技术来管理内存,例如 new
和 delete
。 new
优于 malloc
的好处是 new
将在构造函数的帮助下正确初始化对象,而不是简单地给你一个内存区域,你需要在其中仔细构造一个对象 in-place。同样,delete
将正确调用对象的析构函数(而 free
不会)。
假设你的链表节点class/struct被称为Node
,表达式new Node
将为一个节点分配内存,return一个指向该节点的指针;如果内存不可用,将尽力尝试抛出异常(std::bad_alloc
)。
您可能想尝试 catch 它,但如果内存不足,您可能无能为力,因为打印错误消息等有用的操作本身可能需要分配内存。
进入内存分配并不是现代 C++ 的主要方法。我们一般倾向于使用std
容器(vector
、list
、map
...)或者std智能指针——作为主要的解决方案;如果这不适用 and/or 需要自定义容器智能指针,则可以考虑 类 的 std::allocator
系列。只有最后一个选项是 new
/delete
运算符。当您一直阅读这篇 post 到这里时,内存损坏的风险逐渐增加;如果你进一步深入挖掘,会出现严重危险的 C API 和 malloc
/free
函数族,但这个函数远远超出了限制,除非在非常极端的情况下几乎不使用。
我已经有好几年没有使用 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++ 自己的技术来管理内存,例如 new
和 delete
。 new
优于 malloc
的好处是 new
将在构造函数的帮助下正确初始化对象,而不是简单地给你一个内存区域,你需要在其中仔细构造一个对象 in-place。同样,delete
将正确调用对象的析构函数(而 free
不会)。
假设你的链表节点class/struct被称为Node
,表达式new Node
将为一个节点分配内存,return一个指向该节点的指针;如果内存不可用,将尽力尝试抛出异常(std::bad_alloc
)。
您可能想尝试 catch 它,但如果内存不足,您可能无能为力,因为打印错误消息等有用的操作本身可能需要分配内存。
进入内存分配并不是现代 C++ 的主要方法。我们一般倾向于使用std
容器(vector
、list
、map
...)或者std智能指针——作为主要的解决方案;如果这不适用 and/or 需要自定义容器智能指针,则可以考虑 类 的 std::allocator
系列。只有最后一个选项是 new
/delete
运算符。当您一直阅读这篇 post 到这里时,内存损坏的风险逐渐增加;如果你进一步深入挖掘,会出现严重危险的 C API 和 malloc
/free
函数族,但这个函数远远超出了限制,除非在非常极端的情况下几乎不使用。