繁体   English   中英

unique_ptr 两次调用析构函数

unique_ptr is calling destructor twice

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我有一个代码块,我在其中使用unique_ptr

class Abc {
public:
    std::string msg;
    Abc(std::string m) {
        msg = m;
        std::cout << "Constructor: " << msg << std::endl;
    }  
    ~Abc() {
        std::cout << "Destructor: " << msg << std::endl;
    }
};


int main() {
    auto p = std::make_unique<Abc>(Abc(__func__));
}

但是析构函数被调用了两次。 有没有办法让它只调用一次析构函数?

2 个回复

您首先构造一个临时Abc (即Abc(__func__) ),然后将其传递给std::make_unique ,后者从临时(通过Abc的移动构造函数)构造底层Abc 即构造了两个Abc对象,然后也调用了两次析构函数。

您可以将__func__直接传递给std::make_unique ,即不需要从一开始就构造临时Abc

auto p = std::make_unique<Abc>(__func__); // constructs Abc via Abc::Abc(std::string) directly

您创建了两个对象并看到它们都被破坏了。 Abc(__func__)是一个临时的,在 main 的行尾被销毁。

添加用户定义的移动构造函数以查看make_unique move 如何构造对象:

#include <string>
#include <memory>
#include <iostream>

class Abc {
public:
    std::string msg;
    Abc(std::string m) {
        msg = m;
        std::cout << "Constructor: " << msg << std::endl;
    }
    Abc(Abc&& other){
        msg = other.msg + " moved";
        std::cout << "Move Constructor: " << msg << "\n";
    }  
    ~Abc() {
        std::cout << "Destructor: " << msg << std::endl;
    }
};


int main() {
    auto p = std::make_unique<Abc>(Abc(__func__));
}

输出

Constructor: main
Move Constructor: main moved
Destructor: main
Destructor: main moved
1 静态 unique_ptr 两次调用析构函数

我使用了一个单例模式,它返回对 unique_ptr 取消引用的引用。 这是代码, 我原以为类的析构函数只会调用一次,但是虽然调用一次的构造函数调用了两次析构函数,但这里是输出, 为什么析构函数调用了两次? 甚至第二次调用这个地址也是不同的。 ...

2 unique_ptr没有在try / catch中调用析构函数

我有一堂课: 然后我有以下示例代码: 我不清楚为什么在try / catch中没有调用析构函数。 唯一ID范围是否不会到期才能调用dtor? 感谢您提供任何信息。 ...

2014-11-07 20:00:40 1 423   c++
3 析构函数和unique_ptr

我有以下代码 除非我注释掉析构函数,否则它不会编译(gcc 4.7)。 实际上,我在代码中并不需要这个析构函数,我只是想将它用于调试目的。 但是,我不明白发生了什么,因此我担心我做错了什么。 这里发生了什么? ...

5 C ++ unique_ptr没有调用析构函数[关闭]

我有一个unique_ptr的vector ,它指向一个名为state的类。 当我用向量调用pop_back()时,唯一的指针将从内存中删除(我认为),但它指向的状态对象永远不会被删除。 在删除它指向的对象时,或者唯一指针以某种方式不会调用析构函数? 我所知道的是,当从向量中移除我的唯一指 ...

6 使用unique_ptr保护的析构函数

我正在尝试从第三方库调用API。 当我要对具有受保护的析构函数的类使用unique_ptr时遇到麻烦。 这是例子 我正在尝试将Parent_ptr与Parent类一起使用。 但是编译器抛出了错误 有摆脱这个问题的想法吗? 由于它们是第三方库的类,因此我无法破解Pa ...

2019-05-30 11:41:18 2 87   c++
7 std :: unique_ptr析构函数构造函数顺序

我想知道何时将新的unique_ptr分配给先前的unique_ptr,会发生什么。 在以下代码中: 我预计当我第二次分配一个新的std :: unique_ptr进行测试时,首先调用my_class的析构函数,然后调用它的构造函数。 我的预期是错的吗? 但是当我调试我的代码时,我 ...

2018-07-28 06:16:32 2 229   c++/ std
暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM