Thread_local std::unique_ptr释放未调用析构函数
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();
相关文章:
- 调用析构函数以释放动态分配的内存
- std::unordered_map析构函数不释放内存?
- 如何在 c++ 中的析构函数中正确释放合并 LL 的内存?
- 使用析构函数释放链表
- C++ 在不释放内存的情况下调用析构函数
- C++ - 析构函数只是释放内存还是实际删除对象
- 为什么要在释放分配给该对象的内存之前调用该对象的默认析构函数?
- 如何释放C++异常类析构函数中的变量
- 通过复制将对象传递给 CUDA 内核会调用其析构函数并过早释放内存
- 为什么析构函数不释放数组内存?
- C++析构函数以释放内存
- C++析构函数无法正确释放
- SDL在析构函数上释放曲面失败
- 需要析构函数来释放内存空间,即使所有项目都已弹出
- 类析构函数和指针释放
- 在析构函数c++中释放多个缓冲区
- 释放用户定义表达式析构函数中的动态内存
- 调用析构函数以释放C++运算符中的内存的正确方法是什么
- boost::lockfree::队列似乎没有释放内存,尽管每个集合对象上的析构函数都被调用
- 虚拟析构函数和内存释放