关于 C++ 中自定义对象的构造函数/析构函数和 new/delete 运算符

2023-12-08

假设我有一个自己创建的链表。它有自己的析构函数,可以释放内存。这个链表不会重载new或delete。

现在,我正在尝试创建一个所述链表的数组(开放散列,如果我理解正确的话)。然后我在这个开放哈希类的构造函数中分配必要的内存。在构造函数内部调用的 new 运算符足以正确地为数组分配内存,对吗?我不确定,因为我还没有为 Linked List 类重载 new 。

另外,假设我的链接列表数组称为元素,我可以在析构函数中编写“delete[] elements”吗?这会调用数组中每个元素的析构函数并正确释放内存吗?

最后,如果我的两个假设都是正确的(即,我不必重载 new 和 delete 来将它们与我的自定义类一起使用),那么重载此类运算符的意义何在?


嗯你是对的。一个平原

elements = new LinkedList[N];

足以分配它们。然后您可以访问它们

elements[i]->push(....);

并使用您显示的方式在析构函数中删除它们:

delete[] elements;

编译器将记住分配了多少个元素,并正确调用每个列表的析构函数。重载new和delete运算符的目的是提供自定义内存分配策略。例如,您可以预先分配内存,然后从该池中获取内存,而不是每次都从操作系统中分配内存。

但请注意,您还必须编写复制构造函数和复制赋值运算符。因为如果有人复制你的哈希图,链表也必须被复制,而不仅仅是指针。或者,您可以将复制构造函数和复制赋值运算符设为私有,并且不定义它们,从而禁止复制哈希映射:

....
private:
    MyHashMap(MyHashMap const& rhs);
    MyHashMap & operator=(MyHashMap const& rhs);
....
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

关于 C++ 中自定义对象的构造函数/析构函数和 new/delete 运算符 的相关文章

随机推荐