作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
自从我完成任何 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
,表示一个元素。您的问题实际上显示出这种歧义,您不知道是否要删除 ListNode
或 List
在析构函数中。将它们分开可以解决这个问题。
关于c++ - 在一个类的析构函数中应该删除的所有内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39299795/
我是一名优秀的程序员,十分优秀!