Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Nochmal Speicherfreigabe

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
09.12.2004, 18:59 Uhr
derphilipder



Gibt es eine Möglichkeit zu überprüfen, ob in einer Anwendung der gesamte mit new allokierte Speicher am Ende wieder freigegeben ist?
--
Konfuzius says: "A man who goes to bed with an itchy asshole is a man who wakes up with stinky finger!"
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
09.12.2004, 19:59 Uhr
(un)wissender
Niveauwart


Nein, aber du kannst das ganz schnell selber machen.
Überschreibt new, new[], delete, delete[] und merk dir was du allokierst bzw. freigibst.
--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
09.12.2004, 20:03 Uhr
derphilipder




Zitat von (un)wissender:

Überschreibt new, new[], delete, delete[] und merk dir was du allokierst bzw. freigibst.

Irgendwie versteh ich den Satz nicht.
--
Konfuzius says: "A man who goes to bed with an itchy asshole is a man who wakes up with stinky finger!"
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
10.12.2004, 06:51 Uhr
(un)wissender
Niveauwart


Ok, schlecht formuliert.
Diese globalen funktionen musst du überschreiben.
Dann wird nichts mehr an die vorbei allokiert und du kannst alle Speicheranforderungen und Freigaben protokollieren.
Google ist da auch überaus hilfreich.

void *operator new (size_t);
void operator delete (void *);
oder
void operator delete (void *, std::size_t);

void *operator new[] (size_t);
void operator delete[] (void *);
oder (weiß nicht ganz genau)
void operator delete[] (void *, std::size_t);


Bearbeitung:

Es gibt auch noch Placement new(allokiert keinen Speicher, sondern konstruiert im übergebenen Speicher) und die nothrow-Variante, aber new + delete sollten reichen.


--
Wer früher stirbt ist länger tot.

Dieser Post wurde am 10.12.2004 um 06:54 Uhr von (un)wissender editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
10.12.2004, 07:14 Uhr
(un)wissender
Niveauwart


So, hier mal ein Beispiel:


C++:
#include <iostream>
#include <cstdlib>  
#include <cstddef>
#include <memory>

void * operator new(std::size_t);
void operator delete(void*);

int main()
{
    int * p = new int;
    delete p;
}

void * operator new(std::size_t size)
{
    std::cout << "Called operator new with size: " << size << std::endl;
    if(size == 0) size = 1;
    
    //Bis erfolgreicht oder Handler false liefert.
    while(true)
    {
        void * p = ::malloc(size);
        if(p) return p;
        std::new_handler globalHandler = std::set_new_handler(0); //Keine Handler setzen, den alten bekommen.
        std::set_new_handler(globalHandler); //Handler setzen
        if(globalHandler) (*globalHandler)(); //Wenn Handler da, Handler rufen, kann der Speicher besorgen?
        else throw std::bad_alloc();
    }
    
}    
void operator delete(void* p)
{
    std::cout << "Called operator delete for: " << p << std::endl;
    if(!p) return; //Null löschen ist immer ok;
    ::free(p);
}


--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
10.12.2004, 10:55 Uhr
derphilipder



Aah! Das ist natürlich raffiniert.
Da wär ich nie drauf gekommen.
--
Konfuzius says: "A man who goes to bed with an itchy asshole is a man who wakes up with stinky finger!"
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
10.12.2004, 12:48 Uhr
Guybrush Threepwood
Gefürchteter Pirat
(Operator)


Und wo geschieht der Aufruf des CTors bzw. Dtors??
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
10.12.2004, 14:22 Uhr
(un)wissender
Niveauwart


Das macht der Compiler, wir überladen hier nur operator new, der den Speicher holt. Operator new konstruiert dann das Objekt. Schwierig zu unterscheiden, die beiden.

C++:
int * z = new int; //ruft Operator new auf, der dann operator new (den man überladen kann) aufruft, um den Speicher zu bekommen
int* z = static_cast<int*>(::operator new(sizeof(int))); //ruft nur operator new auf (den man überladen kann)


--
Wer früher stirbt ist länger tot.

Dieser Post wurde am 10.12.2004 um 14:23 Uhr von (un)wissender editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
10.12.2004, 14:26 Uhr
virtual
Sexiest Bit alive
(Operator)


Klarer wird es ggf. wenn man sich mal mit den Allocatoren der STL bzw. dem inplacement new auseinandersetzt.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
11.12.2004, 12:06 Uhr
Guybrush Threepwood
Gefürchteter Pirat
(Operator)


Hmm denke ich hab's so halbwegs verstanden.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: