Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » feststellen ob objekt mit new erstellt wurde

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 < [ 2 ]
000
14.01.2004, 11:15 Uhr
~pepe__
Gast


Hi!

Kann man im irgendwie im nachhinein feststellen ob ein Objekt, mit "new" erstellt wurde, wenn man nur einen Pointer auf das Objekt hat.

Danke
Marcel
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
14.01.2004, 11:20 Uhr
typecast
aka loddab
(Operator)


Setz den Pointer im Konstruktor oder am Anfang des Programms auf NULL. Dann kannst du mit

C++:
if (ObjectPointer == NULL)
  ObjectPointer = new Object(...);



überprüfen, ob das Objekt schon erzeugt wurde oder nicht. Wenn du dann ein delete machst, dann musst du darauf achten den Zeiger anschließend auch wieder auf NULL zu setzen, da dass nicht automatisch geschieht
--
All parts should go together without forcing. ... By all means, do not use a hammer. (IBM maintenance manual, 1925)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
14.01.2004, 11:32 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


@Loddab
hmm ich dacht immer das new ein NULL zurückgibt wenn es nicht geklappt hat...
wenn dem so wäre ist es doch überflüssig vorher zu prüfen sondern besser nach dem allokieren zu prüfen...oder hab ich die frage falsch verstanden
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
14.01.2004, 11:38 Uhr
typecast
aka loddab
(Operator)


@windalf: Jetzt wo ich mir die Frage ein zweites mal durchlese, dann kommen mir doch zweifel ob ich sie richtig verstanden habe.
--
All parts should go together without forcing. ... By all means, do not use a hammer. (IBM maintenance manual, 1925)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
14.01.2004, 11:43 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


@Loddab
Naja ist ja auch egal...
auf jeden Fall sollte seine Frage jetzt hoffentlich beantwortet sein...
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
14.01.2004, 11:50 Uhr
virtual
Sexiest Bit alive
(Operator)



Zitat:
~pepe__ postete
Kann man im irgendwie im nachhinein feststellen ob ein Objekt, mit "new" erstellt wurde, wenn man nur einen Pointer auf das Objekt hat.


Nein
--
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
006
14.01.2004, 11:53 Uhr
typecast
aka loddab
(Operator)


@virtual: Erklär das bitte genauer!
--
All parts should go together without forcing. ... By all means, do not use a hammer. (IBM maintenance manual, 1925)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
14.01.2004, 11:56 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


@virtual
Raus mit der Sprache...Lass uns nicht doof sterben
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
14.01.2004, 12:29 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


@Loddab
*argh*...jetzt wo ich die frage nochmal lese würde ich sagen das wir sie beide nicht richtig gelesen haben, wenn der verfasser der frage das meint was er geschrieben hat...

Um die Frage umzuformulieren...Der Verfasser will wissen ob man wenn man ein pointer auf ein Objekt hat herausbekommen kann ob der speicher dynamisch allokiert wurde oder nicht....
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
14.01.2004, 12:44 Uhr
virtual
Sexiest Bit alive
(Operator)


Ich sage nur, daß es keine einfache portable Möglichkeit gibt für folgendes:

C++:
class X
{
public:
     bool is_created_with_new()
     {
     .... ??? ....
     }
};

int main()
{
    X a;
    X* b= new X;

    a.is_created_with_new(); // soll false ergeben
    b->is_created_with_new(); // soll true ergeben
}


Eine (triviale) Lösung dieses Problems kenn ich nicht.

Was gehen dürfte, ist das überladen vom Operator new, der dann eine liste über die belegten Speicherbereiche hält, aber das will der Fragesteller wohl nicht wissen:

C++:
#include <iostream>
#include <cstdlib>
#include <map>

typedef std::map<char*,size_t> new_map_t;

new_map_t allocation_map;

void* operator new(size_t size)
{
    char* ptr = static_cast<char*>(malloc(size));
    if (NULL == ptr) throw std::bad_alloc();
    allocation_map.insert(std::make_pair(ptr, size));
    return ptr;
}


void operator delete(void* ptr)
{
    if (NULL != ptr)
    {
        allocation_map.erase(static_cast<char*>(ptr));
        free(ptr);
    }
}


class X
{
public:
    bool is_allocated_with_new() const
    {
        const char* ptr = reinterpret_cast<const char*>(this);
        for(new_map_t::const_iterator i=allocation_map.begin();
            i!= allocation_map.end();
            ++i)
        {
            if (ptr>=i->first && ptr<i->first+i->second) return true;
        }
        return false;
    }
};


int main()
{
    X a;
    X* b = new X;

    std::cout<<"a mit new erzeugt: "<<a.is_allocated_with_new()<<std::endl;
    std::cout<<"b mit new erzeugt: "<<b->is_allocated_with_new()<<std::endl;
}




Bearbeitung:

Noch ein kleiner Nachtrag, um Zweifel auszuräumen: Ich empfehle nicht diese "Lösung" zu verwenden! Ich empfehle eher ein Programm Design, wo es keine rolle spielt, ob was mit new erzeugt wurde oder nicht!

--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)

Dieser Post wurde am 14.01.2004 um 12:47 Uhr von virtual editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ 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: