diff --git a/src/blitter/factory.hpp b/src/blitter/factory.hpp --- a/src/blitter/factory.hpp +++ b/src/blitter/factory.hpp @@ -8,7 +8,6 @@ #include "base.hpp" #include "../debug.h" #include "../string_func.h" -#include #include /** @@ -16,8 +15,16 @@ */ class BlitterFactoryBase { private: - char *name; - typedef std::map Blitters; + const char *name; + + struct StringCompare { + bool operator () (const char *a, const char *b) const + { + return strcmp(a, b) < 0; + } + }; + + typedef std::map Blitters; static Blitters &GetBlitters() { @@ -58,7 +65,7 @@ public: if (this->name == NULL) return; GetBlitters().erase(this->name); if (GetBlitters().empty()) delete &GetBlitters(); - free(this->name); + free((void *)this->name); } /** diff --git a/src/driver.cpp b/src/driver.cpp --- a/src/driver.cpp +++ b/src/driver.cpp @@ -156,7 +156,9 @@ void DriverFactoryBase::RegisterDriver(c strecpy(buf, GetDriverTypeName(type), lastof(buf)); strecpy(buf + 5, name, lastof(buf)); - std::pair P = GetDrivers().insert(Drivers::value_type(buf, this)); + const char *longname = strdup(buf); + + std::pair P = GetDrivers().insert(Drivers::value_type(longname, this)); assert(P.second); } @@ -194,7 +196,14 @@ DriverFactoryBase::~DriverFactoryBase() strecpy(buf, GetDriverTypeName(type), lastof(buf)); strecpy(buf + 5, this->name, lastof(buf)); - GetDrivers().erase(buf); + Drivers::iterator it = GetDrivers().find(buf); + assert(it != GetDrivers().end()); + + const char *longname = (*it).first; + + GetDrivers().erase(it); + free((void *)longname); + if (GetDrivers().empty()) delete &GetDrivers(); - free(this->name); + free((void *)this->name); } diff --git a/src/driver.h b/src/driver.h --- a/src/driver.h +++ b/src/driver.h @@ -8,7 +8,6 @@ #include "debug.h" #include "core/enum_type.hpp" #include "string_func.h" -#include #include bool GetDriverParamBool(const char * const *parm, const char *name); @@ -37,9 +36,17 @@ DECLARE_POSTFIX_INCREMENT(Driver::Type); class DriverFactoryBase { private: Driver::Type type; - char *name; + const char *name; int priority; - typedef std::map Drivers; + + struct StringCompare { + bool operator () (const char *a, const char *b) const + { + return strcmp(a, b) < 0; + } + }; + + typedef std::map Drivers; static Drivers &GetDrivers() {