【发布时间】: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 << "Destroying: " << this << "\n";,你可能会看到你正在销毁不同的BABE对象。然后问问自己这些物体是从哪里来的。 -
经常在析构函数中打印出对象的地址可以帮助阐明问题。例如,如果您还打印了构造函数中的地址,您可以玩匹配游戏,看看谁在何时或如果您不小心调用了您未使用或实现的构造函数时被删除。
标签: c++ oop destructor