Archiv verlassen und diese Seite im Standarddesign anzeigen : Zeiger auf void?
Mal eine Frage, ich habe da letztens was gelesen was mich ein bischen verwirrt hat. Wie ist es möglich, dass eine Funktion einen Zeiger auf void zurückgibt? Weil, wie soll sie einen zeiger übergeben, wenn sie an für sich nichts zurückgeben soll??
:mauer: :mauer: :mauer:
void *x ();
sowas ist selten denn dann muesste es auch
void freeX (void *z); geben. kannste mal das sample bzw die funktion der funktion beschreiben!
nicht das du sowas gesehen hast
void (*func) ();
weil das ist der prototyp einer funktion
void a ()
{
// funk. a
}
void b ()
{
// funk. b
}
void main ()
{
func x;
x = a;
x (); // es wird a ausgefuehrt
x = b;
x (); // es wird b ausgefuehrt
}
ich vermute das war es was du gesehen hast
also, das geht dabei um den operator new.
ich schreib einfach mal die definition der methode hier rein:
void * X::operator new(size_t size)
{
new_handler globalHandler = std::set_new_handler (currenthandler);
void * memory;
try {
memory = ::operator new(size)
}
catch( std::bad_alloc) {
std::set_new:handler(globalHandler);
throw;
}
std::set_new_handler(globalHandler);
return memory;
}
wenn ihr wollt, kann ich noch den rest der hier vielleicht relevanten klasse posten
also das ist ne klasse, und die hat nen destructor der wieder aufrauemen kann, deshalb ist das ok!
und dann ist es auch noch im operator new, was der genau macht und warum das mit dem void * zurueck gegeben wird weiss ich auswendig nicht, aber wenns dich interessiert, dann kann ich in meiner c++Bibel mal nachschauen
Jan Krüger
26.07.2002, 15:06
najo... void* ist halt ein typenlosen zeiger... malloc() gibt sicher auch void* zurück. :)
PS. komischer beispielcode ;)
Wenn ich mich nicht irre, steht void* für einen Zeiger, der keinen speziellen Typ hat, es ist also so ne Art "allgemeiner" Zeiger.
@Scooter
es geht darum dass man das sogut wie nie macht, weil entweder gibt man einen speicher zurueck der bereits wieder freugegben wurde oder man baut speicherlecks ein. sonderfaelle bestaetigen die regel, vorallem bei klassen kann es vorkommen
ähm, mir is grgad was komisches aufgefallen, anstatt den smiley soll da :o stehen. :D
das was ich mich nur frage, ist was ist ein zeiger auf void. was die funktion macht is bis auf den aufruf und die rückgabe für mich klar.
hmm ich google einfach mal ein bischen, mal gucken was bei rauskommt.
StoreMaster
27.07.2002, 12:08
sowas macht man, wenn man nicht weiss welcher typ zurückgegeben wird.
danke, so lieb ich es, kurz knappe antwort :D
@StoreMaster
jepp aber das ist ein pointer und sowas geht nicht
char *x ()
{
char y[256];
strcpy (z, "Halli Hallo");
return y;
}
grundsaetzlich gibt man keinen zeiger zurueck!!!!!!!!!
ausnamhen klassen, ...
StoreMaster
29.07.2002, 09:54
@x00n
ist schon klar, hab mich nicht auf den rückgabewert bezogen, sondern mehr um den void pointer. mein fehler
ThreeJay
13.08.2002, 03:19
Also wie schon gesagt, ist void * ein Typenloser Zeiger. Allerdings heisst das nur, dass der Typ des Zeigers erst durch den Aufruf feststeht. Wie z.B. beim Operator new:
char *zeichen;
zeichen = new char;
Damit reserviert man einfach nur Speicher im Heap....
Bei dem Beispiel das du gepostet hast wird genau dieser Operator überladen.
Jan Krüger
13.08.2002, 04:21
Ich verstehe nicht, warum man keine Pointer zurückgibt...?
Ich habe das schon gemacht und werde es auch weiter machen. Gut, es kommt nicht häufig vor, aber kaputt machen kann man damit eigentlich auch nichts (solange man weiß, wie man mit dem Speicher umzugehen hat). :)
//edit
Verrücktes, gerade ausgedachtes Beispiel (C, unter C++ ist es witzlos):
man nehme eine selbst gebaute Lib zum Verwenden von Hashlisten. Also verketteten Listen, deren Einträge in einer Hash-Tabelle eingetragen sind. Dafür braucht man eine Funktion "getitem", die einen Namen als Parameter akzeptiert und einen Zeiger auf den Eintrag mit dem angegebenen Namen zurückliefert. Denn die Lib ist allgemein gehalten und wir kennen die Typen der Einträge nicht.
Wir sehen, unter C kann es doch schon mal vorkommen, unter C++ dagegen kommt man oft drumherum. :D
malloc und calloc geben auch einen void-pointer zurück. -> es hat immer sinn einen void-pointer zurückzugeben, (wie JaSt schon gesagt hat) wenn man nicht weiss welchen typ man benötigt.
he, und void * ist ansi c ;)
vBulletin® v3.8.6, Copyright ©2000-2012, Jelsoft Enterprises Ltd.