Fix memory leak with WordLists

https://www.mail-archive.com/lyx-devel@lists.lyx.org/msg198230.html
This commit is contained in:
Guillaume Munch 2016-12-31 15:16:15 +01:00
parent 0eb0b8531a
commit 9a9288d67d
3 changed files with 8 additions and 25 deletions

View File

@ -234,7 +234,6 @@ LyX::~LyX()
{
delete pimpl_;
singleton_ = 0;
WordList::cleanupWordLists();
}

View File

@ -16,6 +16,7 @@
#include "support/debug.h"
#include "support/docstring.h"
#include "support/lassert.h"
#include "support/unique_ptr.h"
#include "support/weighted_btree.h"
#include <QThreadStorage>
@ -27,7 +28,7 @@ using namespace std;
namespace lyx {
///
typedef map<string, WordList *> GlobalWordList;
typedef map<string, unique_ptr<WordList>> GlobalWordList;
// Each thread uses its own word list, but only the one of the GUI thread is
// used to do real work. The others are only neded to prevent simultanous
// write access e.g. from a cloned buffer and a true document buffer.
@ -38,27 +39,12 @@ WordList & theWordList(string const & lang)
{
if (!theGlobalWordList.hasLocalData())
theGlobalWordList.setLocalData(new GlobalWordList);
GlobalWordList * globalWordList = theGlobalWordList.localData();
GlobalWordList::iterator it = globalWordList->find(lang);
if (it != globalWordList->end())
GlobalWordList & globalWordList = *theGlobalWordList.localData();
GlobalWordList::iterator it = globalWordList.find(lang);
if (it != globalWordList.end())
return *it->second;
else {
WordList * wl = new WordList;
(*globalWordList)[lang] = wl;
return *wl;
}
}
void WordList::cleanupWordLists()
{
if (!theGlobalWordList.hasLocalData())
return;
GlobalWordList * globalWordList = theGlobalWordList.localData();
GlobalWordList::const_iterator it = globalWordList->begin();
for (; it != globalWordList->end(); ++it)
delete it->second;
globalWordList->clear();
else
return *(globalWordList[lang] = make_unique<WordList>());
}
@ -73,7 +59,7 @@ struct WordList::Impl {
};
WordList::WordList() : d(new Impl)
WordList::WordList() : d(make_unique<Impl>())
{
d->c_ = 0;

View File

@ -30,8 +30,6 @@ public:
void insert(docstring const & w);
///
void remove(docstring const & w);
///
static void cleanupWordLists();
private:
struct Impl;