Memory Pool, Speicher reservieren.
-
Hallo!
Da Boost fallweise nicht eingesetzt werden kann, ist ein eigener Memory
Pool entstanden. Folgende Eckpunkte:-
Beim einmaligen Reservieren von Speicher durch den Pool soll kein
Konstruktor aufgerufen werden, daher kommt nicht new[], sondern malloc/free
zum Einsatz. Ist das sauber oder sollte mit new char[num*sizeof(MyClass)]
gearbeitet werden? Vor- und Nachteile? -
Klassen, deren Instanzen im Pool gebaut werden, haben einen operator new
in der folgenden Art:
void *MyClass::operator new(size_t siz, Pool<MyClass>& pMem)
{
return pMem->get();
}..wobei der Pool selbst ein Template ist, das mit dem MyClass-Typ parametrisiert
ist, wordurch der Pool bereits die Größe von MyClass kennt und auf den
Parameter siz verzichten kann.- Der Destruktor so einer Klasse soll aufgerufen werden können. Allerdings
ohne daß er Speicher freigibt, denn das soll ja der Pool einmalig mit free
erledigen. Daher:
MyClass
{
public:
static void operator delete (void{};
}
Dieser Ansatz ist implementiert und funktioniert unter Linux und Windows 64bit.
Auf Windows 32-bit gibt es mit dem gleichen Code aber Ärger. Ich habs auf
Speicher, der vom Pool kommt, eingegrenzt und suche die genaue Ursache noch.
Daher wollte ich dieses prinzipielle Design diskutieren.
-
-
...ping.
-
Was für Probleme gibts denn?
-
gibt es mit dem gleichen Code aber Ärger
Tolle Fehlerbeschreibung.
-
Lies dir bitte dringendst die mit "wichtig" gekennzeichneten Threads in diesem Forum durch (vor allem den, auf den meine Signatur verlinkt) und stelle deine Frage dann bitte noch einmal. So, dass man sie auch beantworten kann.
-
knivil schrieb:
gibt es mit dem gleichen Code aber Ärger
Tolle Fehlerbeschreibung.
Bedaure, wenn mein Post nicht klar war. Hier soll kein konkreter Fehler
diskutiert werden. Der zitierte Satz sagt aus, daß es einen Grund gibt,
das Design zu hinterfragen. Nur ob die Eckpunkte 1,2,3 sauber gelöst
sind, wollte ich diskutieren und auf Verbesserungspotential abklopfen.mfg
-
Ich habe bei solchen Problemen immer einen eigenen Allocator geschrieben.
Den Speicher habe ich üblicherweise mitnew char[X]
angefordert und beim construct eben ein placement new aufgerufen.
Ich weiß aber noch, dass ich damals ein Problem mit dem alignment hatte, das ging aber auch relativ einfach zu lösen. Perstd::alignment_of
intype_traits
.
Zerstört wird überlicherweise mit allocator::destroy.Jetzt überlädst du noch die operatoren new und delete + new[] und delete[], wenn du den allocator nicht in deinem eigenen code drin haben möchtest und bist fertig.
(dann denkst du noch mal an das alignment und guckst, ob du das bedacht hast und wirst deinen Fehler ziemlich sicher finden ;))bb
edit: das hilft dir bestimmt - klingt ziemlich genau nach deinem problem: http://www.c-plusplus.net/forum/274218