summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar Dirk Hohndel <dirk@hohndel.org>2013-10-08 22:44:38 -0700
committerGravatar Dirk Hohndel <dirk@hohndel.org>2013-10-08 23:11:28 -0700
commit2e43769108d4023c215451fa8116abdc991e0f19 (patch)
treefaece0f537183ca9d3a55e39207228d828f82e75
parent7813ac86bf5bfaeee3d4652b35dcfd8972775423 (diff)
downloadsubsurface-2e43769108d4023c215451fa8116abdc991e0f19.tar.gz
Avoid the memory leaks from translations
Instead use a hash to cache the translations (and allow for the ability to clear the hash so we can even switch translations at runtime...). Now Qt will keep track of the memory and release it for us when we are done with it. This avoids the memory leak introduced in commit 4ecb35bf5ff2 ("Make a copy of the translated text"). Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
-rw-r--r--gettextfromc.cpp12
-rw-r--r--gettextfromc.h11
2 files changed, 17 insertions, 6 deletions
diff --git a/gettextfromc.cpp b/gettextfromc.cpp
index fe6263a4b..de278afeb 100644
--- a/gettextfromc.cpp
+++ b/gettextfromc.cpp
@@ -2,9 +2,17 @@
#include <QString>
#include <gettextfromc.h>
-char *gettextFromC::gettext(const char *text)
+const char *gettextFromC::gettext(const char *text)
{
- return strdup(tr(text).toLocal8Bit().data());
+ QByteArray &result = translationCache[text];
+ if (result.isEmpty())
+ result = tr(text).toUtf8();
+ return result.constData();
+}
+
+void gettextFromC::reset(void)
+{
+ translationCache.clear();
}
gettextFromC* gettextFromC::instance()
diff --git a/gettextfromc.h b/gettextfromc.h
index 3852709c9..7d7bca142 100644
--- a/gettextfromc.h
+++ b/gettextfromc.h
@@ -1,6 +1,7 @@
-#ifndef GETTEXT_H
-#define GETTEXT_H
+#ifndef GETTEXTFROMC_H
+#define GETTEXTFROMC_H
+#include <QHash>
extern "C" const char *gettext(const char *text);
@@ -9,7 +10,9 @@ class gettextFromC
Q_DECLARE_TR_FUNCTIONS(gettextFromC)
public:
static gettextFromC *instance();
- char *gettext(const char *text);
+ const char *gettext(const char *text);
+ void reset(void);
+ QHash <const char *, QByteArray> translationCache;
};
-#endif // GETTEXT_H
+#endif // GETTEXTFROMC_H