Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
何时需要删除指针,何时需要将指针设置为0? 我是一个学习C++的CS学生。_C++_Pointers - Fatal编程技术网

何时需要删除指针,何时需要将指针设置为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。但有时我从人们那里得到的印象是,不管怎样,只要这样做都是很好的做法,即使在看起来很明显指针不再被使用的情况下也是如此。@Floryn--是的。将
ptr
设置为0没有任何作用,因为它即将消失。另外,当我在做时,
if(ptr)删除ptr不是必需的
delete
可以处理空指针。