Re: std::facet nicht auf dem Heap erzeugbar?
Ralf Pichocki wrote:
Compiler VS2005.
Okay, dann solltest Du keine Einschraenkungen haben was Locales angeht.
Hmmm, fehlender Default-Wert fuer den Referenzzaehler? Was genau ist der
Fehler, wie sieht der Konstruktor aus? Eventuell musst Du auch einen
Ich habe in meinem Ctor explizit den Param gesetzt:
Charshift_io::Charshift_io()
: std::codecvt< char, wchar_t, mbstate_t >(1) {}
NB: Auch mit Wert 0 ergibt sich keine ??nderung.
Hmmm. Du solltest den Default genau so wie auch in der Basisklasse machen.
Der Punkt ist dass auf die obige Art der Code den Du hattest ein Leak
erzeugt:
locale loc( locale(), new Charshift_io);
Der Referenzzaehler ist zu Anfang eins, locale erhoeht ihn auf zwei bis es
zerstoert wird und danach ist er wieder eins, und die Facette wird nicht
geloescht.
Fehlermeldung:
error C2661: 'std::locale::facet::operator new' : no overloaded
function
takes 3 arguments
und danach dann:
error C2664: 'std::locale::locale(const char *,std::locale::category)'
:
cannot convert parameter 1 from 'std::locale' to 'const char *'
Hehe ;)
Irgendwo hast du wohl #define new DEBUG_NEW stehen. Das kannst Du wenn Du
willst auch so lassen, aber dann brauchst Du den ueberladenen 'operator
new' von den MFC (keine Ahnung welcher Header).
Seltsam, ich will eigentlich den vierten Ctor der Doku verwenden, den der
als ersten Param eine const locale& bekommt, nicht einen String. Irgendwie
finde ich auch in den Quelltexten GAR KEINE Konstruktoren f??r
std::locale... (aber das ist wohl ein Folgefehler, nehme ich an)
DIESER Code funktioniert:
Charshift_io csio;
std::locale loc( std::locale(), &csio );
(aber nur mit 1 als Refz??hlerparam, bei 0 gibt's beim Zerst??ren einen
Fehler.)
Ja, wenn 'csio' mit refcount=0 initialisiert wird, ruft ~locale() delete
darauf auf, was ja falsch ist. Daher:
Charshift_io csio(1);
std::locale loc( std::locale(), &csio);
Uli