J'ai essayé de déclarer la variable de pointeur thread_local, puis de pointer vers un nouvel objet dans un thread.C++: Comment utiliser thread_local pour déclarer une variable pointeur?
thread_local static A* s_a = nullptr;
Semblait la mémoire du nouvel objet n'a pas été libéré lorsque le fil détruit. J'ai également essayé d'utiliser unique_ptr, mais toujours fuite de mémoire. J'utilise VS 2015.
Voici le code. Ajouter un point de rupture à return 0
, vérifiez la mémoire du processus, vous verrez la mémoire augmente beaucoup.
#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;
}
Ma question est de savoir comment utiliser thread_local pour déclarer une variable de pointeur manière correcte?
Merci.
Je voudrais que ce soit une instance singleton dans un thread, quel est le timing pour le supprimer? pourquoi utiliser unique_ptr fuite de mémoire encore? – ldlchina
Pertinent: https://stackoverflow.com/questions/17668729/memory-leak-in-gcc-4-8-1-when-using-thread-local. Et un [rapport de bug gcc] (https://gcc.gnu.org/bugzilla/show_bug.cgi?id=57914). Censément fixé en 4.8.2. – AMA
'static thread_local unique_ptr' devrait fonctionner. Comment savez-vous qu'il y a une fuite? – rustyx