gpt4 book ai didi

c++ - thread_local std::unique_ptr 释放不调用析构函数

转载 作者:太空宇宙 更新时间:2023-11-04 15:18:35 25 4
gpt4 key购买 nike

为什么不在this code中调用析构函数? :

#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

最佳答案

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

关于c++ - thread_local std::unique_ptr 释放不调用析构函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25326325/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com