![](/img/trans.png)
[英]Do i need to delete objects that i set in class member when i replace them?
[英]When do I need to delete pointers, and when do I need to set them to 0?
我是一名 CS 学生,正在学习 C++。
这是一个普遍的问题,但我正在使用的特定示例是创建一个链表,该链表将具有存储字符串指针的节点。
class LinkNode {
public:
friend class Stack;
LinkNode* next;
std::string* data;
LinkNode(std::string* data, LinkNode* next) :data(data), next(next) { ; }
}
如果我使用指针,那么我不应该有一个析构函数在next
和data
上调用delete
吗?
~LinkNode() {
delete this->data;
delete this->next;
}
我的教材中使用的代码以及互联网上的示例都忽略了包含这一点(即使我们确实在其他上下文中使用了析构函数)。 我试图理解为什么在这种情况下不需要这样做。
而且,相当相关:如果我使用指针来删除某些东西,我是否必须将指针设置为 null?
我经常看到人们这样写删除:
delete ptr;
ptr = 0;
据我了解,将其设置为 0 的目的只是为了防止它被意外使用,因为delete
后它现在指向一个无效的 memory 地址。
因此,如果我在 function 的末尾调用delete
,其中指针将掉出 scope 无论如何,就像在弹出 function 或析构函数中一样,可以删除该行吗? 人们只是出于习惯而包含它吗?
delete
指向有效对象/变量的指针以销毁它们并释放空间。NULL
、 nullptr
或0
(完全相同),以便您可以将它们识别为未使用。 你看,如果你只是delete
object,指针本身不会改变,所以现在它指向了memory的无效空间。 如果您再也不会使用该指针,那么这没什么大不了的,否则可能会很成问题。
因此,将其设置为null
允许您对指针执行检查并确定您的指针是否正在使用。
此外,作为您的第一个问题,正如评论中指出的那样,您必须在使用new
创建的指针上调用delete
。
data
指针指向在列表之外创建的字符串(因此它的行为类似于引用列表)。 在这种情况下,该指针不负责管理其内容并且不应被删除。data = new string("whatever");
,那么是的,你应该在析构函数中删除它们。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.