Я попытался объявить переменную указателя thread_local, а затем указать на новый объект в одном потоке.
thread_local static A* s_a = nullptr;
Казалось, что память нового объекта не была освобождена при уничтожении потока. Я также пытался использовать unique_ptr, но все равно утечка памяти. Я использую VS 2015.
Вот код. Добавьте точку останова в return 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;
}
Мой вопрос: как использовать thread_local для правильного объявления переменной указателя?
Спасибо.
static thread_local unique_ptr
должно работать. Как узнать, что есть утечка? - person rustyx   schedule 26.09.2017