调用析构函数后访问对象

2024-01-06

在下面的代码中我调用~destructor()明确地。但是该对象仍然可以访问。我怎样才能删除它(让它消失)?

class Queue {
    public:
    node* top = NULL;//points to the top of the queue 
    //methods:
    void enqueue(int data);//adds a node to the queue
    void dequeue();
    //printing 
    void print();
    //destructor 
    ~Queue();
};

和析构函数:

Queue::~Queue() {
    //The destructor deletes all items from HEAP
    //Then sets the top to 0
    while (top != NULL)
        this->dequeue();//dequeue until there are NO more items
    top = 0;
}

在源码.cpp中:

Queue q;

q.enqueue(1);
q.enqueue(2);
q.enqueue(3);
q.enqueue(4);

q.dequeue();
q.dequeue();
q.print();

q.~Queue();
q.print();//Here I need to have an ERROR!

q.enqueue(7);//Here I need to have an ERROR!
q.print();//Here I need to have an ERROR!

输出是:

4 3 7

我预计会出现错误:

标识符“q”未定义


Taking //Here I need to have an ERROR!从字面上看,您将这样做:

{
    Queue q;

    q.enqueue(1);
    q.enqueue(2);

    q.dequeue();
    q.print();
}
q.print();        // THIS WILL PRODUCE AN ERROR

您似乎对堆栈分配对象的生命周期有误解。堆栈对象在超出范围时会自动销毁。示例中的范围q以。。结束}.

自己调用析构函数几乎总是错误的(我恰好遇到过一种情况,可以显式调用析构函数)。为什么?考虑一下:

{
    Queue q;
    q.~Queue();   // DONT DO THIS !
}

您调用了析构函数,但当它超出范围时,它会再次被销毁,并且您将收到令人讨厌的运行时错误。

您在代码中执行的操作:

Queue q;
q.~Queue();
q.print();

is 未定义的行为 https://en.cppreference.com/w/cpp/language/ub!

另请注意,调用析构函数并不是删除对象时发生的全部事情。当删除堆栈分配的对象时,首先调用其析构函数,然后释放分配的内存。通常您不想干扰此过程,幸运的是您很少需要这样做。

我怎样才能删除它(让它消失)?

你无法让它“消失”。当对象被销毁时,内存中的位和字节不会被删除。那将是非常低效的。其实我觉得Cfree有一个更好、更不容易混淆的名字。内存被释放以供以后使用,它不会被擦除,以致无法读取之前的内容。

为了进一步阅读,我建议您参考这个略有不同但相关的问题的详尽答案:局部变量的内存可以在其作用域之外访问吗? https://stackoverflow.com/questions/6441218/can-a-local-variables-memory-be-accessed-outside-its-scope?rq=1

另外,我建议您阅读有关RAII https://en.cppreference.com/w/cpp/language/raii它依赖于自动调用析构函数。

TL;DR:如果您想清除Queue然后写:

q.clear();
q.print(); // prints an empty queue!

永远不要调用堆栈分配对象的析构函数!它将被自动调用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

调用析构函数后访问对象 的相关文章

随机推荐

  • 声明 xsl 变量并为其赋值

    我正在开发一个使用 apache cocoon 将 XML 转换为 PDF 的应用程序 并且我正在重新设计处理输入 XML 的 XSL 目前在 XSL 中 我们有这样的代码
  • 使设置随机种子独立的函数

    有时我想编写一个随机函数 它始终为特定输入返回相同的输出 我总是通过在函数顶部设置随机种子然后继续来实现这一点 考虑以这种方式定义的两个函数 sample 12 lt function size set seed 144 sample 1
  • 更改运行 Windows 窗体程序的用户

    我用 C 编写了一个简单的 Windows 窗体程序 我希望能够输入 Windows 用户名和密码 当我单击登录按钮来运行代码时 我会以我输入的用户身份运行代码 您可以使用 WindowsIdentity Impersonate 方法来 实
  • iOS购买收据验证失败怎么办?

    iOS购买收据服务器验证通常是这样的 用户在 iPhone 上购买 您的应用程序将购买收据发送到服务器 服务器收到收据并发送给Apple进行验证 服务器从Apple获取验证结果 服务器将验证结果发送给应用程序 但如果只有第 1 步成功怎么办
  • 带填充的 Python 整数到十六进制字符串

    考虑一个整数 2 我想将其转换为十六进制字符串 0x02 通过使用python的内置函数hex 我可以获得 0x2 这不适合我的代码 谁能告诉我如何以方便的方式获得我想要的东西 谢谢 integer 2 hex string 0x 02x
  • 将 CoreData 添加到现有项目

    我正在尝试将 CoreData 添加到现有项目中并且 有奇怪的错误 我收到错误 由于未捕获的异常而终止应用程序 NSInvalidArgumentException 原因 无法创建 NSPersistentStoreCoordinator
  • 当 `git add` 操作时,“不会添加文件别名‘samefile’(‘SameFile’已存在于索引中)”

    我下载了linux的内核源代码 并且想要git add商场 When I git add git 开始添加它们 但很快它返回一个错误 fatal Will not add file alias include linux netfilter
  • 应用掩码以格式化 SQL Server 查询/视图中的字符串

    有没有一种巧妙的方法可以将掩码应用于 SQL Server 查询中的字符串 我有两张表 一张的电话号码存储为 varchar 没有文字0155567890和电话类型 其中具有该电话号码类型的掩码 返回字符串 对于合并文档 以便查询返回完全格
  • 您可以对多个泛型类型参数强制执行相同的约束吗?

    我知道你可以 你可以这样做 void M
  • 无法在 Linux 上安装 pyodbc

    我正在运行 Linux 2 6 18 164 15 1 el5 centos plus 并尝试安装 pyodbc 我正在执行 pip install pyodbc 并得到一个很长的错误列表 其结尾为 错误 命令 gcc 失败 退出状态为 1
  • 如何减少 SORT 操作中的 CPU 占用

    我正在使用 DFSORT 将磁带数据集复制到临时文件 并处理大约 80000000 条记录 仅复制数据集就需要 3 个小时 有没有其他方法可以减少CPU时间 建议将会非常有帮助 谢谢 STEP40 EXEC SORTD SORTIN DD
  • AWS - IAM 角色和信任关系

    我是 AWS 和 IAM 的新手 正在尝试了解角色和信任关系 我完全理解为什么使用角色 如何创建它们以及它们的用例 我不明白的是信任关系步骤 在我见过的几乎所有案例中 都是一对一的关系 EC2 需要与 EC2 建立信任 为什么会有额外的步骤
  • 如何在 .env 文件中定义数组/对象?

    以下是我的 Javascript 对象 window options VAR1 VAL1 VAR2 VAL2 VA31 VAL3 我希望它 对象或数组 定义在 env文件 我怎样才能做到这一点 值在 env值只能是字符串 简单的解决方法是将
  • 在 directx 11 中渲染 h264 视频帧

    我是新来的DirectX 我正在尝试编写一个自定义 IP 摄像机视频播放器 并且我正在使用它DirectX11使用 Wpf Gui 作为前端渲染解码图像 I am a 时间 2019 03 17 标签 c developer并使用了托管的d
  • 使用 Backbone.js 和 Underscore,如何从模型中获取项目数?

    我有一个用于通知的通知模型 MODEL NotificationModel App BB Model extend defaults COLLECTION NotificationCollection App BB Collection e
  • Django 管理员登录返回 Forbidden 403 CSRF 验证失败。请求已中止

    对 Django 来说还很陌生 按照 Django 网站上的民意调查教程完成第二个项目 之前的努力虽然简单 但进展顺利 这次访问管理员登录时遇到问题 当我尝试登录时 我已经创建了一个超级用户并使用这些凭据http 127 0 0 1 800
  • Android - OnClick Listener 在一个单独的类中

    是否可以创建一个辅助类来保存 OnClick 侦听器 意思是不是在 Activity 类中创建的 我只是发现将 OnClick 侦听器放在主活动类中很混乱 我宁愿将它们放在单独的类中 谢谢 当然 这是可能的 只需创建一个实现的类View O
  • 在android中创建水平和垂直的虚线

    我想在android中使用形状绘制水平和垂直的虚线 我想画成这样 对于水平线
  • 更新 Heroku 上的堆栈

    我有一个小应用程序在那里运行 使用heroku buildpack perl https github com miyagawa heroku buildpack perl构建包 这只是一个小Plack http p3rl org Plac
  • 调用析构函数后访问对象

    在下面的代码中我调用 destructor 明确地 但是该对象仍然可以访问 我怎样才能删除它 让它消失 class Queue public node top NULL points to the top of the queue meth