何时需要删除指针,何时需要将指针设置为0? 我是一个学习C++的CS学生。
这是一个一般性的问题,但我正在处理的一个特殊示例是创建一个链表,该链表将具有存储字符串指针的节点何时需要删除指针,何时需要将指针设置为0? 我是一个学习C++的CS学生。,c++,pointers,C++,Pointers,这是一个一般性的问题,但我正在处理的一个特殊示例是创建一个链表,该链表将具有存储字符串指针的节点 class LinkNode { public: friend class Stack; LinkNode* next; std::string* data; LinkNode(std::string* data, LinkNode* next) :data(data), next(next) { ; } } 如果我使用的是指针,那么我不应该有一个析构函数,在下一个
class LinkNode {
public:
friend class Stack;
LinkNode* next;
std::string* data;
LinkNode(std::string* data, LinkNode* next) :data(data), next(next) { ; }
}
如果我使用的是指针,那么我不应该有一个析构函数,在下一个
和数据
上调用delete
~LinkNode() {
delete this->data;
delete this->next;
}
我的教育材料中使用的代码以及互联网上的示例都忽略了这一点(即使我们在其他环境中使用析构函数)。我试图理解为什么在这种情况下不需要这样做
而且,非常相关的是:如果我使用指针来删除某些内容,我是否必须将指针设置为null
我经常看到人们这样写删除:
delete ptr;
ptr = 0;
据我所知,将其设置为0的目的只是为了防止意外使用它,因为在delete
之后,它现在指向一个无效的内存地址
因此,如果我在函数末尾调用delete
,指针无论如何都会超出范围,比如在pop函数或析构函数中,我可以省略该行吗?人们只是出于习惯才把它包括进来吗?
指向有效对象/变量的指针,以销毁它们并释放空间删除
- 将它们设置为
、NULL
或nullptr
(完全相同),以便您可以将它们标识为未使用0
删除对象,指针本身不会改变,所以现在它指向一个无效的内存空间。如果您再也不打算使用该指针,那么这没什么大不了的,但否则它可能会有很大的问题
因此,将其设置为null
允许您对指针执行检查,并确保指针是否正在使用
此外,要作为第一个问题回答,正如评论中指出的,您必须调用delete
,对使用new
创建的指针进行删除
- 因此,假设示例中的
数据
指针指向在列表
之外创建的字符串(因此其行为类似于引用列表)。在这种情况下,指针不负责管理其内容,不应删除
但是,例如,如果每次添加新节点时,您都执行了data=newstring(“无论什么”)代码>,然后是,您应该在析构函数中删除它们
可以说,您根本不应该使用指针。然后你就不必担心这个了。每一个new
ed的对象都应该delete
d。这是唯一的要求。删除的位置和方式无关紧要。然而,除非遵循某些最佳实践,否则实现这一崇高目标几乎是不可能的,而且内存崩溃!确实,如果在程序结束时没有得到delete
d,则程序结束,即程序结束。然而,除非学习了正确的内存管理技巧,否则,移动到更大更好的C++类的机会将非常渺茫。实际上,它非常简单:<代码>删除<代码> >您创建的代码> > < <代码>,以及<代码>删除[]/Cord> >您用<代码>新[]/CODE >创建的内容。要正确组织这一过程并防止内存泄漏(恼人的)或重复删除(未定义的行为),有时并不是那么简单。因此,充其量,您不再使用new
,而是更喜欢现代的替代品。(即使是生产性代码也可以在没有文字的情况下编写)>新的< /代码> /<代码>删除< /代码>)因此,如果我在函数的末尾调用删除,那么指针将落入范围之外,如果在函数中间(您调用的东西)抛出异常,将会怎样?这样就不会到达函数的末尾了?@Scheff您的意图是说我不需要删除这些字符串指针,因为我没有使用new
关键字?我会对有关空指针的部分使用稍微不同的措辞:如果您的设计要求使用空指针来表示缺少资源,那么您可以应该将指针设置为null。这避免了一些人编写的愚蠢代码:~my_class(){delete ptr;ptr=0;}
+1.另外,delete
无论你如何new
ed。指向不是用new
创建的东西的指针不应该被删除。@PeteBecker所以,尽可能清楚地说,该析构函数的非愚蠢版本是~my_class(){delete ptr;}
?我尽量不认为“好代码”只意味着做严格必要的事情。我问=0如果这确实是它的唯一功能,则可以省略code>。但有时我从人们那里得到的印象是,不管怎样,只要这样做都是很好的做法,即使在看起来很明显指针不再被使用的情况下也是如此。@Floryn--是的。将ptr
设置为0没有任何作用,因为它即将消失。另外,当我在做时,if(ptr)删除ptr代码>不是必需的delete
可以处理空指针。