c++ - 什么时候需要删除指针,什么时候需要将它们设置为 0?
问题描述
我是一名学习 C++ 的 CS 学生。
这是一个普遍的问题,但我正在使用的特定示例是创建一个链表,该链表将具有存储字符串指针的节点。
class LinkNode {
public:
friend class Stack;
LinkNode* next;
std::string* data;
LinkNode(std::string* data, LinkNode* next) :data(data), next(next) { ; }
}
如果我使用指针,那么我不应该有一个delete
同时调用next
and的析构函数data
吗?
~LinkNode() {
delete this->data;
delete this->next;
}
我的教材中使用的代码以及互联网上的示例都忽略了包含这一点(即使我们确实在其他上下文中使用了析构函数)。我试图理解为什么在这种情况下不需要这样做。
而且,非常相关:如果我使用指针来删除某些东西,我是否必须将指针设置为空?
我经常看到人们这样写删除:
delete ptr;
ptr = 0;
据我了解,将其设置为 0 的目的只是为了防止它被意外使用,因为delete
它现在指向无效的内存地址。
因此,如果我delete
在函数末尾调用指针将超出范围的函数,例如在弹出函数或析构函数中,我可以省略该行吗?人们只是出于习惯而包含它吗?
解决方案
delete
指向有效对象/变量的指针以销毁它们并释放空间。- 将它们设置为
NULL
,nullptr
或0
(完全相同),以便您可以将它们标识为未使用。
你看,如果你只是delete
对象,指针本身不会改变,所以现在它指向一个无效的内存空间。如果您再也不会使用该指针,那么这没什么大不了的,否则可能会很成问题。
因此,将其设置为null
允许您对指针执行检查并确定您的指针是否正在使用。
此外,要回答您的第一个问题,正如评论中指出的那样,您必须调用delete
您使用创建的指针new
。
- 因此,假设
data
您的示例的指针指向在列表之外创建的字符串(因此它的行为类似于引用列表)。在这种情况下,该指针不负责管理其内容并且不应被删除。 - 但是,例如,如果每次添加新节点时都添加了新节点,
data = new string("whatever");
那么是的,您应该在析构函数中删除它们。
推荐阅读
- javascript - R分析:如何展示一个三向交互的后续分析?
- node.js - 创建中间件函数以检查用户角色是否等于“管理员”
- image - Applying inverse transformation to a transformed image does not give original
- sql-server - 如何使用 SQL Server 2014 动态取消透视列
- javascript - Javascript - 形成按钮 - 方法帖子
- scala - Spark 数据框 Scala 棘手
- python - 只选择一次受槽约束的项目
- sql - 如何在一列中加入列值?
- elasticsearch - 如何使用 Elasticsearch Java RestHighLevelClient API 创建布尔查询
- php - 该代码在输入 phpmyadmin 时有效,但在我的网站中无效