C++ C++;:如何使用thread_local声明指针变量?

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_局部指针变量,然后指向一个线程中的新对象

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非常有用。