thread_local std :: unique_ptr版本未调用析构函数

马特·克拉克森(Matt Clarkson)

为什么在此代码中未调用析构函数

#include <iostream>
#include <thread>
#include <memory>

class base {
    public:
        base() {
            std::cout << "base()" << std::endl;
        }
        virtual ~base() {
            std::cout << "~base()" << std::endl;
        }
        base(const base&) = delete;
        base(base&&) = delete;
        base& operator=(const base&) = delete;
        base& operator=(base&&) = delete;
};

class derived final : public base {
    public:
        derived() {
            std::cout << "derived()" << std::endl;
        }
        virtual ~derived() {
            std::cout << "~derived()" << std::endl;
        }
};


void foo() {
    static thread_local std::unique_ptr<base> ptr;
    if (!ptr) {
        std::cout << "new ptr:" << std::this_thread::get_id() << std::endl;
        ptr.reset(new derived());
    } else {
        std::cout << "release ptr:" << std::this_thread::get_id() << std::endl;
        ptr.release();  // I would expect the destructor to be called here?!
    }
}

void thread_main() {
    foo();
    foo();
}

int main()
{
    std::thread thread1(thread_main);
    thread1.join();
    return 0;
}

输出:

new ptr:140671459997440
base()
derived()
release ptr:140671459997440

我期望:

new ptr:140671459997440
base()
derived()
release ptr:140671459997440
~derived()
~base()

使用 gcc 4.9.1

克瑞克(Kerrek SB)

替换ptr.release();ptr.reset();

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在Visual Studio中,当与std :: async一起使用时,不会调用“ thread_local”变量析构函数,这是一个错误吗?

std :: unique_ptr析构函数构造函数顺序

未调用初始化的静态thread_local结构的构造函数和析构函数

在调用clear时,thread_local std :: list是否放弃分配的内存吗?

C ++ 11 thread_local析构函数的行为

什么时候调用std :: thread析构函数?

std :: unique_ptr是否在其析构函数中将其基础指针设置为nullptr?

std::unique_ptr 在虚拟析构函数上重置 SIGABRT

如果A有析构函数,std :: unique_ptr <A>什么时候需要特殊的删除器?

可连接std :: thread的析构函数

std :: unique_ptr的自定义删除程序是否是手动调用析构函数的有效位置?

如何允许 std::unique_ptr 访问类的私有析构函数或使用私有析构函数实现 C++ 工厂类?

使用std :: map时,包含unique_ptr的结构中的默认析构函数会导致编译错误

从对象原因到此类的调用析构函数的c ++ std :: thread调用方法

内联函数的局部static / thread_local变量?

具有显式析构函数和std :: unique_ptr <>成员的类不能在std :: vector <>中使用吗?

为什么要为具有非平凡析构函数的类声明constrexpr构造函数(例如unique_ptr,std :: variant)

是否可以通过thread_local实现boost :: thread_specific_ptr?

是否明确定义了哪个线程调用thread_local存储的构造函数?

为什么std :: shared_ptr两次调用我的析构函数?

unique_ptr :: release()是否调用析构函数?

unique_ptr 两次调用析构函数

我的编译器是否忽略了我未使用的静态thread_local类成员?

在OSX上调用旧版C代码的thread_local的替代方法

如何使用非平凡的构造函数构造静态thread_local成员

unique_ptr析构函数的优势

std :: unique_ptr constexpr构造函数

std :: unique_ptr构造函数的行为

无法手动调用std :: string的析构函数

TOP 榜单

热门标签

归档