mah*_*esh 1 c++ smart-pointers unique-ptr delete-operator c++11
我有一个指向由new操作员初始化的类的指针。然后,我使用此指针设置一个std::unique_ptr。现在,据我所知,以下代码具有双重删除功能:一次是手动调用delete运算符,然后是唯一指针超出范围。该代码如何“正确”运行,即没有运行时异常?
#include <iostream>
#include <memory>
class A
{
public:
A()
{
std::cout<<"In A::A()\n";
}
~A()
{
std::cout<<"In A::~A()\n";
}
void printMyStr()
{
std::cout<<"In A::printMyStr()\n";
}
};
int main()
{
std::cout<<"hello world!\n";
A * pa = new A();
std::unique_ptr<A> upa(pa);
pa->printMyStr();
upa->printMyStr();
delete pa; // How does this not create problems?
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出:
hello world!
In A::A()
In A::printMyStr()
In A::printMyStr()
In A::~A()
In A::~A()
Run Code Online (Sandbox Code Playgroud)
显然,即使只创建了一个对象,析构函数也会运行两次。这怎么可能?
注意:我在64位linux上使用gcc 7.3.0。
重复删除是未定义的行为。
未定义的行为不能保证运行时异常;那将被定义。未定义的行为意味着任何事情都可能发生。这可能包括时间旅行,格式化硬盘,将浏览器历史记录通过电子邮件发送给您的联系人,或者什么都不做。
据我所知,我还没有经历过通过电子邮件发送浏览器历史记录的经历。我经历了其余的。