gpt4 book ai didi

c++ - 在一个类的析构函数中应该删除的所有内容

转载 作者:行者123 更新时间:2023-11-30 03:38:47 25 4
gpt4 key购买 nike

自从我完成任何 C++ 编码以来已经有一段时间了,我只是想知道应该在析构函数中删除基本链表中的哪些变量,不幸的是,我目前无法就此事查阅我的 C++ 手册.链表类如下所示:

#include <string>
#include <vector>

class Node
{
Node *next;
string sName;
vector<char> cvStuff;

Node(string _s, int _i)
{
next = nullptr;
sName = _s;

for (int i = 0; i < _i; i++)
{
cvStuff.insert(cvStuff.end(), '_');
}
}

~Node()
{
//since sName is assigned during runtime do I delete?
//same for cvStuff?
}
};

我也很好奇,如果在我调用的析构函数中

delete next;

是否会转到链表的下一个节点并删除该节点,从而递归地从该点删除整个列表?另外,如果是这种情况并且我出于某种原因选择实现它,我是否必须在删除它之前检查 next 是否为 nullptr 或者它不会有什么不同吗?

谢谢。

最佳答案

理想情况下,什么都不做:使用智能指针:std::unique_ptr<> , std::smart_ptr<> , boost::scoped_ptr<>等..

否则,您将删除拥有的 native 指针。是next拥有?

  • 您打算删除列表中间的内容吗?如果是,则不能在析构函数中删除。
  • 你打算分享尾部吗?如果是,您需要引用计数智能指针。

可以删除 nullptr(什么都不做)。在该示例中,您不应删除 sName 和 cvStuff,因为它们在范围内,因此会自动销毁。

此外,如果这将是一个可以变大的列表,您可能想要销毁并释放 *next手动。这是因为您不想通过递归耗尽堆栈空间。

此外,我建议将其分为 List , 表示数据结构和 ListNode ,表示一个元素。您的问题实际上显示出这种歧义,您不知道是否要删除 ListNodeList在析构函数中。将它们分开可以解决这个问题。

关于c++ - 在一个类的析构函数中应该删除的所有内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39299795/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com