重载运算符delete,或者如何杀死一只猫?

2023-12-09

我正在尝试重载运算符删除,以便我可以向那些不希望使用智能指针的人返回一个普通指针,但又能够控制何时删除对象。

我定义了一个由多个灵魂构造的类 Cat,它有一个不执行任何操作的重载运算符删除,以及减少灵魂数量的析构函数(并且还进行了一些吹牛)。当灵魂达到 0 时,析构函数调用全局 ::delete,猫就死了。

这听起来很简单,但并没有按预期工作。这是代码:

class Cat {
public:
    Cat(string n): name(n), souls(9)
    { cout << "Myaou... " << name << " is born\n"; }

    ~Cat();
    void operator delete(void *p) { cout << "!!! operator delete called\n"; }
    void report()
    { cout << name << "'s here, " << souls << " souls to spend\n"; }

    friend ostream& operator<< (const ostream& o, const Cat& cat);
private:
    void kill();
    const string name;
    int souls;
};

Cat::~Cat()
{
    cout << "!!! dtor called\n";
    kill();
}

void Cat::kill()
{
    if (--souls)
        cout << name << " is still alive! I have " << souls << " souls left.\n";
    else {
        cout << name << " is dying... good bye world!\n";
        ::delete((void*)this);
    }
}

ostream& operator<< (const ostream& o, const Cat& cat)
{
    return o << cat.name << "'s here, " << cat.souls << " souls to spend\n";
}

这是主要的:

int main()
{
    Cat *p = new Cat("Mitzi");

    for (;;)
    {
        char c[100];
//      cout << *p;
        p->report();
        cout << "come on, hit me!";
        cin >> c;
        delete p;
    }
}

我预计循环会运行 9 次,然后会发生一些不愉快的事情(崩溃)。但是,这是输出:

Myaou... Mitzi is born
Mitzi's here, 9 souls to spend
come on, hit me!c
!!! dtor called
Mitzi is still alive! I have 8 souls left.
!!! operator delete called
's here, 8 souls to spend
come on, hit me!c
!!! dtor called
 is still alive! I have 7 souls left.
*** glibc detected *** /home/davidk/workspace/string_test/Debug/string_test: double free or corruption (fasttop): 0x080cd008 ***

似乎在第一次删除后名称成员被销毁,下一次删除导致崩溃。有什么解释吗?我在 Linux 上使用 gcc 进行编译,可能是编译器错误吗?

顺便说一句,当我在 cout

thanks!


您滥用了所有可能的 C++ 概念,这会导致错误。什么时候delete p;第一次调用 C++ 调用Cat::~Cat()隐式销毁的析构函数std::string实体内部。什么时候delete p;第二次被调用Cat::~Cat()重新运行并且它重新运行的析构函数std::string这会导致未定义的行为使程序崩溃,因为我想std::string::~string()不会使指向缓冲区的指针无效,所以当std::string::~string()尝试使用相同的地址第二次释放缓冲区,这会导致著名的双重释放。

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

重载运算符delete,或者如何杀死一只猫? 的相关文章

随机推荐

  • 函数应以字节切片形式返回 sha256/sha384/sha512 结果

    我正在编写一个函数 它将输入数据作为字符串以及要调用的 SHA 算法的位大小 它应该将生成的哈希值作为字节切片返回 第一次尝试 package main import crypto sha256 crypto sha512 errors f
  • Outlook VBA 将电子邮件从子文件夹导入 Excel

    我正在尝试将收件箱中每封电子邮件的详细信息 发件人 接收时间 主题等 导入到 Excel 文件中 我的代码适用于收件箱中的特定文件夹 但我的收件箱有几个子文件夹 并且这些子文件夹也有子文件夹 经过多次尝试和错误 我成功导入了收件箱下所有子文
  • 使用 JNA User32 平台图的 NoSuchMethodError

    我在第一次尝试使用 User32 Instance 时收到以下错误 线程 main 中的异常 java lang NoSuchMethodError com sun jna Native load Ljava lang String Lja
  • 循环遍历表单上所有未绑定的控件并清除数据

    我想循环遍历表单上的所有 UNBOUND 控件并清除它们的数据或重置它们的值 我有文本框 组合框和复选框 每次我尝试这样的事情 Dim ctl As Control For Each ctl In Me Controls If IsNull
  • FPDF - 在多单元中写入HTML?

    WriteHTML可以放在Multicell中吗 如何 我检索并显示了数据库中的 HTML 输出 但想将其放置在第二列中 比方说 因此我将其放入 Multicell 中 但没有效果 下面不起作用 pdf gt Multicell 70 3
  • 这个带有逗号的 CSS 选择器到底匹配什么?

    我有一个关于 CSS 选择器的问题 在我的 CSS 文件中 我有以下代码 table legenda th td text align left vertical align top font weight bold color 76818
  • 在 Windows Phone 中打开 PDF 文件

    我正在开发一个适用于 Windows Phone 7 的应用程序 并为其使用 Phonegap 模板 一切看起来都很完美 但现在我无法在浏览器中打开 PDF 文件 我尝试了以下方法 但不起作用 因为 PDF 的 url 超出了 2048 个
  • 在 postgresql 中将日期转换为整数

    我正在尝试将日期 日期类型 转换为 int 这个 int 应该类似于自 1900 年 1 月 1 日以来的天数 如何在 postgresql 中获取它 在 Excel 中 当我将日期与字符串连接时 我会自动获取此信息 示例 2011 11
  • RequireJS:回调函数中的依赖项和参数的数量不同

    我有遗留代码和这样的模块定义 define a b c d function a b c 您可以看到 依赖项比我们在模块中使用的实际参数多 这有什么意义吗 我认为模块 d 是多余的 这仅意味着模块 d 或者更准确地说 调用 d 工厂函数的结
  • 使用 shell_exec 从 PHP 中调用 Python

    我的默认 Web 应用程序基于 PHP 不过 为了简单起见 我构建了一个 python 脚本来进行一些分析 现在我需要 php 来调用 python 代码并检索 python 代码提供的输出 这两个文件位于同一服务器中 但不在同一文件夹中
  • 使用 重定向

    以下行应保存新项目并重定向到另一个页面 到目前为止 它保存正确 但没有重定向 没有错误或警告
  • WP7中如何改变点击时按钮的颜色?

    在WP7中 每当单击按钮时 按钮的背景就会变成白色 表明该按钮被单击 并在释放鼠标按钮时变得正常 但是我想将按钮选择的颜色从白色更改为橙 色 我该如何点呢 你将不得不玩Visual States那个Button控制 以下是默认样式Butto
  • T-SQL JSON:如何在 JSON 数组中搜索值

    我们正在使用 Azure SQL 并有一个名为 Companies 的表 其中一列包含 JSON JSON 字段的结构为 DepartmentLink https company com ContactName John Doe Conta
  • React hooks useEffect 仅在更新时?

    如果我们想限制useEffect要仅在组件安装时运行 我们可以添加第二个参数useEffect with useEffect gt 但我们怎样才能使useEffect仅在组件更新时运行 初始安装除外 如果您希望 useEffect 仅在除初
  • tf.nn.conv2d 在张量流中做什么?

    我正在查看有关张量流的文档tf nn conv2d here 但我无法理解它的作用或它想要实现的目标 它在文档上说 1 将滤波器展平为具有形状的二维矩阵 filter height filter width in channels outp
  • 如何在 VS2008 中将用户控件构建到独立程序集中?

    更具体地说 在 Visual Studio 2008 中执行此操作与 VS2005 不同时 我需要了解哪些信息 我找到了大量关于在 VS2005 中执行此类操作的参考资料 例如 http webproject scottgu com CSh
  • MySQL 准备语句

    我只是想知道是否有一种方法可以在 MySQL 中使用某种形式的准备好的语句 这样我就不必转义所有输入 也不必将所有文件从 MySQL 切换到 MySQLi 我真的不相信转义函数 所以如果有任何可以在常规 MySQL 中工作的替代方法 那就太
  • 分组集合选择按字母顺序排列的轨道

    我终于弄清楚如何使用动态选择菜单本教程 一切正常 但如何按名称组织下拉列表中的城市 下面是我编写的所有代码 如果您需要更多信息 请告诉我 Rails 新手请帮忙 VIEWS div class field div I would like
  • Jquery UI 自动完成 ajax 未填充下拉框

    我需要帮助 我看不出问题出在哪里 当我在 html 文件中设置自动完成源时 它工作正常 当我在 ajax php 中打印相同的源或数据库值并通过 ajax 返回它时 它不起作用 可能是什么问题呢 请帮助 Html
  • 重载运算符delete,或者如何杀死一只猫?

    我正在尝试重载运算符删除 以便我可以向那些不希望使用智能指针的人返回一个普通指针 但又能够控制何时删除对象 我定义了一个由多个灵魂构造的类 Cat 它有一个不执行任何操作的重载运算符删除 以及减少灵魂数量的析构函数 并且还进行了一些吹牛 当