小编mah*_*esh的帖子

使用另一个指针在一个“ unique_ptr”拥有的对象上调用“ delete”

我有一个指向由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。

c++ smart-pointers unique-ptr delete-operator c++11

1
推荐指数
1
解决办法
315
查看次数

标签 统计

c++ ×1

c++11 ×1

delete-operator ×1

smart-pointers ×1

unique-ptr ×1