Objekte löschen mit delete
-
brotbernd schrieb:
Normale Zeiger sollte man in gutem C++ Code möglichst selten sehen.
Normale besitzende Zeiger. Zeiger, die lediglich passiv auf andere Objekte verweisen, sind kein Problem. Gleiches für Referenzen.
-
Um nochmal etwas produktiv zu werden:
Ich habe eine Funktion, die einen TStrings* Parameter erwartet. Wie übergebe ich dieser einen std::auto_ptr<TStringList>? Kann ich den einfach auf TStringList* casten?
-
Heimelchen schrieb:
Ich habe eine Funktion, die einen TStrings* Parameter erwartet. Wie übergebe ich dieser einen std::auto_ptr<TStringList>? Kann ich den einfach auf TStringList* casten?
Ich nehme mal an, du meinstest, dass die Funktion als Parameter ein
TStringList*
erwartet? Dann schau in der Referenz vonstd::auto_ptr
nach.Grüssli
-
TString und TStringList sagt mir nichts. Erklär mal, was Du machen willst.
-
void DoSomething(TStrings *Str); std::auto_ptr<TStringList>MyList(new TStringList(NULL); DoSomething(MyList.get());
Das wollt ich tun.
-
Heimelchen schrieb:
Ich habe eine Funktion, die einen TStrings* Parameter erwartet. Wie übergebe ich dieser einen std::auto_ptr<TStringList>? Kann ich den einfach auf TStringList* casten?
std::auto_ptr<TStringList> sl; foo(sl.get());
-
Heimelchen schrieb:
Warum soll ich meine Anwendung mit boost aufblasen (tolles Wortspiel)? Nur damit ich keine Pointer verwenden muss?
Die Prämisse ist fragwürdig. Für die Annahme, die Verwendung von boost-Elementen müsste notwendig die Applikation (mehr als ein handgeschriebenes Äquivalent) aufbähen, hat keine empirische Grundlage. Im Übrigen dienen Smartpointer nicht dazu, Pointer überflüssig zu machen, sondern den Umgang mit diesen zu vereinfachen.
Heimelchen schrieb:
Um nochmal etwas produktiv zu werden:
Ich habe eine Funktion, die einen TStrings* Parameter erwartet. Wie übergebe ich dieser einen std::auto_ptr<TStringList>? Kann ich den einfach auf TStringList* casten?
Das kommt darauf an. Übernimmt die Funktion den Besitz des TStrings, dann ist die Übergabe des Ergebnisses von p.release() angezeigt (p sei der auto_ptr), besser dann dürfte allerdings die Änderung der Funktion sein, damit diese von vornherein eine auto_ptr nimmt und damit die Semantik im Funktionstyp sichtbar ist.
Andernfalls nimmst du einfach p.get()
-
Heimelchen schrieb:
void DoSomething(TStrings *Str); std::auto_ptr<TStringList> MyList (new TStringList(NULL)); DoSomething(MyList.get());
Ohne zu wissen, was TStringList mit TStrings zu tun hat, kann ich Dir nicht helfen. Da es sich um keine Standard-Typen handelt, bist Du hier eher falsch.
Bzgl auto_ptr, es gibt das source/sink-Muster:
auto_ptr<foo> source(); void peek(foo*) {} void sink2(foo* ptr) { auto_ptr<foo> ap (ptr); } void sink(auto_ptr<foo> ap) { sink2(ap.release()); } int main() { auto_ptr<foo> ap = source(); peek(ap.get()); sink(ap); }
Hier wird das "Besitzverhältniss" (bzw die Verantwortlichkeit zum Löschen des foo-Objekts) von source an main, von main an sink und von sink an sink2 übergeben. Wenn Du eine Funktion aufrufen willst (peek), die diese Verantworltlichkeit nicht übernimmt, sollte sie auch keinen auto_ptr entgegen nehmen.
std::auto_ptr ist aber mit Vorsicht zu genießen. Der bessere/sichere Ersatz ist std::unique_ptr, welchen es leider erst ab C++0x gibt.
-
Jaja, ich komm halt von VCL.
TStringList ist ein Nachkomme von TStrings.
-
Heimelchen schrieb:
Jaja, ich komm halt von VCL.
TStringList ist ein Nachkomme von TStrings.Sachen die mit der VCL zu tun haben (da dort einiges "anders" läuft), gehören in das folgende Unterforum: VCL (C++ Builder)
Da es eine VCL-Funktion ist, auf die du keinen Einfluss hast, ist es aber mit ".get()" richtig, es sei den die Funktion übernimmt den Besitz (mir fällt derzeit aber keine VCL-Funktion ein wo dies so wäre).