c++ - 使用另一个指针在 `delete` 拥有的对象上调用 `unique_ptr`

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

我有一个指向由 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 上使用 gcc 7.3.0。

最佳答案

双重删除是未定义的行为。

未定义的行为不保证运行时异常;那将被定义。未定义的行为意味着任何事情都可能发生。这可能包括时间旅行、格式化硬盘、通过电子邮件将浏览器历史记录发送给您的联系人,或者什么都不做。

据我所知,我还没有经历过通过电子邮件发送浏览器历史记录。剩下的我都体验过了。

关于c++ - 使用另一个指针在 `delete` 拥有的对象上调用 `unique_ptr`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52919123/

相关文章:

c++ - 2 个派生类的虚函数(十六进制 + 二进制)

c++ - 使用 Excel C API 调用 Excel 宏函数

c++ - condition_variable,引用和线程:谁拥有锁?

c++ - 通过属性值从 vector 中删除对象的 unique_ptr

c++ - 请问一台电脑 'know'是怎样分配的内存?

c++ - boost::log 在容器中保存消息,然后将所有消息发送到后端

c++ - 是否可以调用显式指定模板参数的模板化转换运算符?

c++ - 类模板化成员函数和返回类型推断

rust - 如何将 Rc<RefCell<Box<MyStruct>>> 传递给接受 Rc<RefCell<Box<dyn MyTrait>>> 的函数?

c++ - 如何返回指向 unique_ptr 包装指针的指针