Frage zur Gültigkeit von auto_prt
-
Hallo Forum,
ich versuche mich gerade an auto_prt:
http://fara.cs.uni-potsdam.de/~kaufmann/?page=GenCppFaqs&faq=auto_ptr#Answvoid Destroy(auto_ptr<X> Stirb) {} int main() { for (int i = 0; i < 10 ; i++) { auto_ptr<X> Pointer(new X); Destroy(Pointer); cout << Pointer.get() << endl; } }1. Warum wird hier der auto_ptr nach destroy zerstört? Wird der Sub Destroy keine Kopie übergeben? Ist ja keine Referenz.
2. Ich muß mich gerade viel mit einer Api herumschlagen die ständig erwartet das ich einen void *Buffer der Bytelänge X übergebe der dann von der Api Funktion beschrieben wird. Nun sehe ich aber das man keine Byte Arrays in auto_ptr lagern darf. Was schlägt Ihr vor? Gibt es da Tricks? Oder muß ich die ganzen delete Statements an jedem Funktionsausgang belassen.
Vielen Dank
Martin
-
Der Pointer ist nicht kopierbar. Wenn der an destroy() übergeben wird, existiert er nur noch in destroy(). In der main ist er gleich null. Und der seine Spur sich in destroy() verliert, wird er da am Ende auch zerstört. Alles so wie es auto_ptr vorsieht.
-
@1: Bei der Parameterübergabe wird der Pointer kopiert (ganz normal), aber die Kopiersemantik von auto_ptr<> klemmt die Quelle von ihrem Objekt ab - d.h. beim Eintritt in die Funktion destroy() wird 'Pointer' auf NULL gesetzt (und beim Verlassen der Funktion wird dessen "Kopie" 'Stirb' vernichtet und löscht die Daten hinter dem Zeiger.
@2: auto_ptr<> ist zwar mitunter praktisch, aber leider nur begrenzt einsetzbar (und leider der einzige Smart-Pointer im Standard). Als Alternative kannst du die Boost-Pointer wie shared_ptr oder shared_array verwenden (oder du nimmst std::vector<> und überlässt ihm die Speicherverwaltung).
-
Vielen Dank CStoll und Artchi

Ich versuche mich mal an shared_array.