Willkommen ~Gast!
Registrieren || Einloggen || Hilfe/FAQ || Staff
Probleme mit der Registrierung im Forum? Melde dich unter registerEin Bild.
Autor Beitrag
000
29.12.2002, 11:16
Diablo_bth



also mein Prob is folgendes: ich hab Speicher und würde darauf gerne Objecte einer Klasse erstellen und auch wieder "abbauen" - ohne dass der Speicher angetastet wird. In einem C++ Buch stand dazu:

Zitat:

3.) Man hat bereits Speicher (pBuf) auf dem Heap und möchte ein Objekt (pObj) genau dort konstruieren:
→ Placement-new
pObj = new (pBuf) MyClass(...);

Beachte: Der Programmierer kann einen Konstruktor nicht explizit aufrufen!

aber de M$-Compiler meckert, vonwegen keine 2 Parameter an new...

und den Konstruktor direkt aufrufen geht auch nicht [obj->MyClass()] - aber dafür der Destruktor (!) (obj->~MyClass()). [obwohl im Buch stand, dass man das nicht explicit könne]

Also kann mir da jemand helfen?? Das kann doch wohl nicht angehen, dass man in VC++ den Destruktor aber nicht den Konstruktor explizit aufrufen kann. (oder liegt das in deren destruktiven Mentalität - wer weis)

--

zum Seitenanfang zum Seitenende Profil || Suche
001
29.12.2002, 11:30
Tron



was zum geier hast du vor, dass du placement new brauchst?
fuer nen eigenen allokator rate ich dazu MyClass::new zu verwenden.

<edit>
so, hab mir mal die muehe gemacht und ein kleines beispiel gebastelt.
ich hoffe es passt zu deinem problem.
natuerlich muss man das fuer einen echten einsatz noch kraeftig ueberarbeiten, also speicher wieder verwenden und es fehlen noch die ueberladungen von new[] und delete[], aber es soll ja nur das prinzip aufzeigen.

Quellcode:#include <iostream>

char  heap[32];
char* pos = heap;

class test
{
  public:
    test(int I) : i(I) { std::cout << "test "  << i << std::endl; }
    ~test()            { std::cout << "~test " << i << std::endl; }

    static void* operator new (size_t size)
    {
      if (pos + size > heap + sizeof(heap)) throw std::bad_alloc();

      test* pointer = reinterpret_cast<test*>(pos);
      pos += size;

      std::cout << "test::new " << pointer << std::endl;

      return pointer;
    }

    static void operator delete (void* pointer)
    {
      std::cout << "test::delete " << pointer << std::endl;
    }

    int i;
};

int main()
{
  std::cout << "heap @ " << reinterpret_cast<void*>(heap) << std::endl;

  test* t = new test(0);
  test* u = new test(1);
  test* v = new test(2);

  delete t;
  delete u;
  delete v;

  try
  {
    for (int i = 3;;++i) new test(i); // kinder, macht das nicht zuhause nach (;
  }
  catch (std::bad_alloc&)
  {
    std::cout << "heap depleted" << std::endl;
  }

  return 0;
}

--

'KEINE PANIK' - aus der Triologie in fuenf Baenden von Douglas Adams

'FÜR DEINN FERD' - aus 'Gevatter Tod' von Terry Pratchett


Dieser Beitrag wurde am 29.12.2002 um 13:39 von Tron bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
002
29.12.2002, 13:42
Diablo_bth



k ich hab ne eigene Pool-Klasse gemacht, die Speicher für objekte Verwaltet (z.B. Render-Objekte einer GameEngine - die schnell allociert und gefreed werden sollten)

--

zum Seitenanfang zum Seitenende Profil || Suche
003
29.12.2002, 13:45
Tron



Zitat:
Diablo_bth postete
allociert und gefreed

<deutsche sprache hochhalt>
alloziieren und freigeben

btw: hast die pm gelesen?

<edit>*schaem*tippfehler

--

'KEINE PANIK' - aus der Triologie in fuenf Baenden von Douglas Adams

'FÜR DEINN FERD' - aus 'Gevatter Tod' von Terry Pratchett


Dieser Beitrag wurde am 29.12.2002 um 13:45 von Tron bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
004
29.12.2002, 13:47
Diablo_bth



ja ich hab die pm gelesen und aber du bist irgendwie net im irc - jedenfalls net auf #thewall.de (oder ich bin zu blöd)

--

zum Seitenanfang zum Seitenende Profil || Suche
005
03.01.2003, 10:39
Kriz



Und Tron, wenn du eh auf std zugreifst, dann setz' auch den Namespace dafür ein. Da bekommt man ja Netzhautgeschwüre von den ganzen Scopys =)

--

K:R-I)Z++
"CSS ist cascading style sheets. Und nicht so'n Ranzspiel." - dp
In memory of Voice († 2005/03/30)

zum Seitenanfang zum Seitenende Profil || Suche