C++ C++;:如何使用thread_local声明指针变量?
我试图声明thread_局部指针变量,然后指向一个线程中的新对象C++ C++;:如何使用thread_local声明指针变量?,c++,c++11,pointers,thread-local-storage,C++,C++11,Pointers,Thread Local Storage,我试图声明thread_局部指针变量,然后指向一个线程中的新对象 thread_local static A* s_a = nullptr; 当线程被破坏时,新对象的内存似乎没有被释放。我还尝试使用unique_ptr,但仍然存在内存泄漏。我正在使用VS 2015 这是代码。在返回0处添加断点,检查进程的内存,您将看到内存增加了很多 #include "stdafx.h" #include <iostream> #include <thread> class A {
thread_local static A* s_a = nullptr;
当线程被破坏时,新对象的内存似乎没有被释放。我还尝试使用unique_ptr,但仍然存在内存泄漏。我正在使用VS 2015
这是代码。在返回0
处添加断点,检查进程的内存,您将看到内存增加了很多
#include "stdafx.h"
#include <iostream>
#include <thread>
class A
{
public:
A(const std::string& name) : name_(name) { std::cout << (name_ + "::A").c_str() << std::endl; }
~A() { std::cout << (name_ + "::~A").c_str() << std::endl; }
const std::string& name(){ return name_; }
private:
std::string name_;
};
thread_local static std::unique_ptr<A> s_a;
//thread_local static A* s_a = nullptr;
static void test(const std::string& name)
{
//A a(name);
if(!s_a)
s_a.reset(new A(name));
//s_a = new A(name);
}
int main()
{
for (size_t i = 0; i < 10000; i++)
{
{
std::thread t0(test, "t0");
std::thread t1(test, "t1");
t0.join();
t1.join();
}
}
return 0;
}
#包括“stdafx.h”
#包括
#包括
甲级
{
公众:
A(const std::string&name):name_uz(name){std::cout标准对线程的支持非常基本
Boost的跨平台支持当然更出色:
// for thread_specific_ptr
#include <boost/thread/tss.hpp>
// define a deleter for As
void destroy_a(A* ptr) noexcept
{
delete ptr;
}
// define the thread_specific pointer with a deleter
boost::thread_specific_ptr<A> s_a { &destroy_a };
static void test(const std::string& name)
{
// create the object in a manner compatible with the deleter
if(!s_a.get())
{
s_a.reset(new A(name));
}
}
//用于特定于线程的\u ptr
#包括
//为As定义一个deleter
无效销毁(a*ptr)无例外
{
删除ptr;
}
//使用删除器定义特定于线程的指针
boost::特定于线程的ptr s_a{&destroy_a};
静态无效测试(常量标准::字符串和名称)
{
//以与删除器兼容的方式创建对象
如果(!s_a.get())
{
s_a.重置(新a(名称));
}
}
该标准对线程的支持非常基本
Boost的跨平台支持当然更出色:
// for thread_specific_ptr
#include <boost/thread/tss.hpp>
// define a deleter for As
void destroy_a(A* ptr) noexcept
{
delete ptr;
}
// define the thread_specific pointer with a deleter
boost::thread_specific_ptr<A> s_a { &destroy_a };
static void test(const std::string& name)
{
// create the object in a manner compatible with the deleter
if(!s_a.get())
{
s_a.reset(new A(name));
}
}
//用于特定于线程的\u ptr
#包括
//为As定义一个deleter
无效销毁(a*ptr)无例外
{
删除ptr;
}
//使用删除器定义特定于线程的指针
boost::特定于线程的ptr s_a{&destroy_a};
静态无效测试(常量标准::字符串和名称)
{
//以与删除器兼容的方式创建对象
如果(!s_a.get())
{
s_a.重置(新a(名称));
}
}
线程本地静态std::unique\u ptr s\u a;
工作。任务管理器中的内存不正确。我使用vld演示内存,未检测到内存泄漏。线程本地静态std::unique\u ptr s\u a;工作。任务管理器中的内存不正确。我使用vld演示内存,未检测到内存泄漏ted.我希望它是线程中的一个单例实例,删除它的时间是什么?为什么使用unique\u ptr仍然存在内存泄漏?相关:。和a。应该在4.8.2中修复。静态线程\u local unique\u ptr
应该可以工作。您如何知道有泄漏?我使用的是VS 2015。只需调试并在“返回0”行停止,请参阅任务管理器中进程的内存。@ldlchina您是如何确定内存没有释放到进程的内存管理器的?检查任务管理器没有任何好处,因为这将包括已释放到本地内存管理器的内存,因为它仍然属于进程。我想您根本没有泄漏,我我打赌你的输出将证明析构函数实际上是被调用的。我希望它是线程中的一个单例实例,删除它的时间是什么?为什么使用unique_ptr仍然存在内存泄漏?相关:。和一个。应该在4.8.2中修复。静态线程_local unique_ptr
应该可以工作。你怎么知道有泄漏?我使用的是VS 2015.只需调试并在“返回0”行停止,请参阅任务管理器中进程的内存。@ldlchina您是如何确定内存没有释放到进程的内存管理器的?检查任务管理器没有任何好处,因为这将包括已释放到本地内存管理器的内存,因为它仍然属于进程。我想您根本没有泄漏,我我敢打赌,您的输出将证明析构函数实际上已被调用。谢谢,这可能有效,我没有尝试。但由于某些原因,我无法使用boost:(这么多人在工作中似乎被禁止使用boost。对我来说,这就像是单腿行走。这是一种耻辱。对。我同意boost非常有用。谢谢,这可能有效,我没有尝试。但出于某种原因,我不能使用boost。)(这么多人似乎被禁止在工作中使用boost。对我来说,这就像是单腿走路。真是太遗憾了。对。我同意boost非常有用。