问题
Why isn't the destructor called in 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;
}
Output:
new ptr:140671459997440
base()
derived()
release ptr:140671459997440
I would expect:
new ptr:140671459997440
base()
derived()
release ptr:140671459997440
~derived()
~base()
Using gcc 4.9.1
回答1:
Replace ptr.release();
with ptr.reset();
.
来源:https://stackoverflow.com/questions/25326325/thread-local-stdunique-ptr-release-not-calling-destructor