【问题标题】:Why destructor is calling?为什么析构函数在调用?
【发布时间】:2021-08-04 00:34:42
【问题描述】:

我有一个简单的代码。

#include <iostream>

struct BABE
{
    std::string* babe = nullptr;

    BABE(const char* str)
    {
        babe = new std::string(str);
    }
    ~BABE()
    {
        delete babe;
    }
};

int main()
{
    BABE bomb = "hello";
    bomb = "world";
    
    system("pause");
    return 0;
}

当我尝试时

bomb = "world";

它分配得很好,但随后析构函数正在调用。

为什么会这样?


【问题讨论】:

  • 你的类/结构违反了 3/5/0 en.cppreference.com/w/cpp/language/rule_of_three的规则
  • 你认为分配bomb = "world"会做什么?
  • 提示:不要使用指针,并尽可能避免使用new。每次分配都会产生许多您必须履行的义务,否则就会遭受无数未定义的行为错误。
  • 为什么会这样? -- 如果你在析构函数中做了std::cout &lt;&lt; "Destroying: " &lt;&lt; this &lt;&lt; "\n";,你可能会看到你正在销毁不同的BABE 对象。然后问问自己这些物体是从哪里来的。
  • 经常在析构函数中打印出对象的地址可以帮助阐明问题。例如,如果您还打印了构造函数中的地址,您可以玩匹配游戏,看看谁在何时或如果您不小心调用了您未使用或实现的构造函数时被删除。

标签: c++ oop destructor


【解决方案1】:

为什么会这样?

因为在这一行:

bomb = "world";

要将const char * 分配给您的类,创建一个临时结构BABE,将该临时分配给bomb(使用编译器生成的赋值运算符),然后该临时被销毁。

由于您违反了Rule of 3/5/0,分配会导致灾难 - 内存泄漏和同一指针的双重删除。

【讨论】:

    猜你喜欢
    • 2014-03-05
    • 2018-05-24
    • 2015-08-21
    • 1970-01-01
    • 2020-08-01
    • 2021-04-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多