Pointer per value
-
kannst natürlich auch pointer per referenz übergeben
void func(int*& ptr){ }
-
life schrieb:
kannst natürlich auch pointer per referenz übergeben
void func(int*& ptr){ }
Warum wird sowas so selten gemacht?
Ich habe noch nie gesehen, dass in fremdem Code ein Pointer per value uebergeben wird, obwohl ich es sehr schoen finde. Hat das irgendwelche Haken?
-
Warum wird sowas so selten gemacht?
Weil meist an dem Objekt auf das der Pointer zeigt geschraubt wird und nicht an dem Pointer selbst. Den Pointer als Referenz zu haben bringt dann keinen weiteren Gewinn eher ist man dardurch beschränkt da eine Referenz z.b "nicht auf NULL zeigen" kann ...
-
Den Pointer als Referenz zu haben bringt dann keinen weiteren Gewinn
Aber es ist doch auch effizienter, weil keine Objekt kopiert werden muessen.
eher ist man dardurch beschränkt da eine Referenz z.b "nicht auf NULL zeigen" kann ...
Aber der Referent, also der Zeiger, kann das. Von daher verstehe ich dieses Argument nicht.
-
Pointer als Referenz zu übergeben kann schon Sinn machen, wenn zum Beispiel erst in der Funktion Speicher für den Pointer allociert wird.
Gruß Alex
-
Raptor schrieb:
life schrieb:
kannst natürlich auch pointer per referenz übergeben
void func(int*& ptr){ }
Warum wird sowas so selten gemacht?
Ich habe noch nie gesehen, dass in fremdem Code ein Pointer per value uebergeben wird, obwohl ich es sehr schoen finde. Hat das irgendwelche Haken?normalerweise ist es sinnlos. weil der pointer nicht verändert werden soll. der speicher, wo der pointer hinzeigt, soll verändert werden, aber dazu reicht ja eine kopie des pointers.
referenzen auf zeiger sehe ich in freier wildbahn ausschließlich bei folgendem anfängerfragment:
template<class T> void destroy(T*& p){ delete p; p=0; } //auch beliebte namen sind save_delete und seltener safe_delete
-
Raptor schrieb:
Den Pointer als Referenz zu haben bringt dann keinen weiteren Gewinn
Aber es ist doch auch effizienter, weil keine Objekt kopiert werden muessen.
referenzen implementiert der compiler mittels zeigern ;). die referenz bringt hier also keinen vorteil.
-
volkard schrieb:
referenzen auf zeiger sehe ich in freier wildbahn ausschließlich bei folgendem anfängerfragment:
template<class T> void destroy(T*& p){ delete p; p=0; } //auch beliebte namen sind save_delete und seltener safe_delete
Und was ist so schlimm daran, ich habe sowas zwar noch nicht gemacht, bzw. würde ich für diese zwei Zeilen keine eigene Funktion schreiben. Aber wieso machen das nur anfänger so und was würden fortgeschrittene anders machen?
Wie sieht das mit meinem Beispiel aus, warum sieht man sowas nie?
Also ich habe sowas schon gemacht und zwar habe ich da erst in der Funktion ermittelt wieviel speicher benötigt wird und habe da erst allociert, zudem hatte die Funktion bereits einen Rückgabewert. Oder macht man das lieber mit einem pointer auf pointer?Gruß Alex
-
Alex_H schrieb:
Und was ist so schlimm daran,
das ist nicht schlimm. es ist eine ganz normale funktion, die jeder mal schreibt. außer mir, denn ich war als ich mit zeigern probleme hatte, noch nicht so weit, referenzen oder gar templates zu benutzen.
ich habe sowas zwar noch nicht gemacht, bzw. würde ich für diese zwei Zeilen keine eigene Funktion schreiben.
sowas? meinste damit das zwanghafte null-setzen aller gestorbener zeiger? falls ja, warum haste das noch nie gemacht? das machen doch viele so.
Aber wieso machen das nur anfänger so und was würden fortgeschrittene anders machen?
fortgeschrittene machen es nicht mehr. zum einen passieren solche fehler wie das zugreifen auf gelöschten speicher nicht mehr, weil man sich irgendwie angewöhnt, dafür zu sorgen, zu wissen, wann objekte leben. typisches beispiel sind zeiger-attribute, die echt nur im dtor gelöscht werden oder nach dem löschen sofort wieder neuen speicher bekommen.
Wie sieht das mit meinem Beispiel aus, warum sieht man sowas nie?
Also ich habe sowas schon gemacht und zwar habe ich da erst in der Funktion ermittelt wieviel speicher benötigt wird und habe da erst allociert,das würde auch noch gehen, daß die funktion den speicherbedarf ermittelt, allokiert und den zeiger zurückgibt.
zudem hatte die Funktion bereits einen Rückgabewert.
man benutzt referenzparameter eigentlich nicht für rückgabewerte. man gibt lieber mal ein std::pair zurück.
außerdem ist natürlich noch feierlich zu überlegen, warum die funktion einen anderen rückgabewert hatte? hatte sie etwa zwei zwecke erfüllt? das soll man auch nicht machen. oder hatte sie nen fehlercode zurückgegeben statt exception zu werfen?
Oder macht man das lieber mit einem pointer auf pointer?
ich mache lieber pointer auf pointer statt referenz auf pointer. aber mit der meinung stehe ich recht alleine da.
-
Danke,
für die Antwortvolkard schrieb:
ich habe sowas zwar noch nicht gemacht, bzw. würde ich für diese zwei Zeilen keine eigene Funktion schreiben.
sowas? meinste damit das zwanghafte null-setzen aller gestorbener zeiger? falls ja, warum haste das noch nie gemacht? das machen doch viele so.
Ich meine extra eine Funktion dafür zu schreiben. Ist das null-setzen wirklich zwanghaft? Ich setze einen toten Zeiger nur Null, wenn ich ihn nochmal brauche oder später nochmal Speicher dafür allociere, und das auch nur, weil ich irgendwann mal gelernt habe, das man die erfolgreiche allokation mit
assert(pointer)
überprüft (keine schöne Lösung aber für den Informatikuntericht wohl das schnellste).
volkard schrieb:
zudem hatte die Funktion bereits einen Rückgabewert.
man benutzt referenzparameter eigentlich nicht für rückgabewerte. man gibt lieber mal ein std::pair zurück.
pair kannte ich bis dato nicht. Danke!
volkard schrieb:
außerdem ist natürlich noch feierlich zu überlegen, warum die funktion einen anderen rückgabewert hatte? hatte sie etwa zwei zwecke erfüllt? das soll man auch nicht machen. oder hatte sie nen fehlercode zurückgegeben statt exception zu werfen?
bekenne mich feierlich schuldig, schuldig. Ich tu mich manchmal noch schwer mit den Exceptions, aber die Übung wirds schon machen. Die zweite Funktionalität kann man auch durch eine Unterfunktion zur Verfügung stellen oder nicht?
volkard schrieb:
ich mache lieber pointer auf pointer statt referenz auf pointer. aber mit der meinung stehe ich recht alleine da.
Ist doch auch der Umständlichere Weg, da du ja extra nochmal allocieren mußt.
Gruß Alex
-
Alex_H schrieb:
Ich meine extra eine Funktion dafür zu schreiben. Ist das null-setzen wirklich zwanghaft? Ich setze einen toten Zeiger nur Null, wenn ich ihn nochmal brauche oder später nochmal Speicher dafür allociere, und das auch nur, weil ich irgendwann mal gelernt habe, das man die erfolgreiche allokation mit
assert(pointer)
überprüft (keine schöne Lösung aber für den Informatikuntericht wohl das schnellste).
nix mit überprüfen. schlägt new fehl wirft es ganz automatisch eine exception(ist mir bis dato aber noch nie vorgekommen...)
volkard schrieb:
ich mache lieber pointer auf pointer statt referenz auf pointer. aber mit der meinung stehe ich recht alleine da.
Ist doch auch der Umständlichere Weg, da du ja extra nochmal allocieren mußt.
ähm hab ich was verpasst? meinst du vielleicht dereferenzieren?
void func(Foo** bar){...} //irgendwoanders Foo* p; func(&p);
und wo ist jetzt die zusätzliche allocation?