我有一个指向类的指针,该类由
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;
}
输出:
hello world!
In A::A()
In A::printMyStr()
In A::printMyStr()
In A::~A()
In A::~A()
显然,析构函数运行两次,即使只创建了一个对象。这怎么可能?
注意:我在64位Linux上使用GCC7.3.0。