![](/img/trans.png)
[英]C++11: GCC 4.8 static thread_local std::unique_ptr undefined reference
[英]thread_local std::unique_ptr release not calling destructor
為什么在此代碼中未調用析構函數:
#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();
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.