Frage zu auto_ptr
-
Nabend.
Ich habe hier ein funktionierendes VC6 Projekt das ich in BCB5 übernehmen möchte.
auto_ptr<char> m_apKey; m_apKey = auto_ptr<char>(new char[m_keylength]);
Jetzt bekomme ich leider den Fehler:
E2285 Keine Übereinstimmung für 'auto_ptr<char>::operator =(auto_ptr<char>)' gefunden
Sieht wer den Fehler und kann diesen mir bitte benennen?
VC6 klappts, aber BCB5 will nicht.
-
Hallo,
Das ist ungültiger Code. auto_ptr darf keine Arrays aufnehmen (delete[]). Wenn du unbedingt einen Smartpointer dafür nehmen willst wäre boost::scoped_array eine Möglichkeit. Wenn du nur kurz ein char-Array brauchst, geht z.Bsp. auch std::vector<char>
-
Hallo
Auch ich rate dir bei Arrays zu std::vector.
Und noch der Hinweis das der VC6 noch älter und fehlerhafter ist als der BCB5. Du solltest darüber nachdenken mit aktuellen Compilern/IDEs zu arbeiten, sei es von Borland, MS oder Freeware.
bis bald
akari
-
Hab auch kleine Frage.
Bisher erstellte ich mein TStringList so
TStringList *Liste = new TStringList(); if (Liste) { delete Liste; }
Nun sah ich das hier und dachte da kann ich sparen
std::auto_ptr<TStringList> Liste(new TStringList()); if (Liste) { }
Leider sagt mir der Compiler das die if(Liste) Zeile eine ungültige Strukturoperation sei. Kann das bitte wer aufklären?
-
Liste ist jetzt vom Typ auto_ptr und da gibt es anscheinend keinen Konvertierungsoperator nach bool. Wenn new schief geht wird hier ja sowieso eine exception geworfen, so dass der ganze Test sinnlos ist. Alternativ kannst du natürlich so testen
if (Liste.get())
std::auto_ptr<>::get() gibt den internen Zeiger zurück.
[edit]
Übrigens brauchst du bei new TStringList das Klammerpaar hinten nicht unbedingt. Das hier geht auch.std::auto_ptr<TStringList> list(new TStringList);
[edit]
-
Also muss man immer eine try/catch um auto_ptr legen?
-
Wenn du denkst, dass das new schief gehen könnte müsstest du um jedes new einen try/catch-Block legen. Da das aber eher selten passiert, es sei denn der Konstruktor der konstruierten Klaase kann eine Exception werfen, macht man das normalerweise nicht.
Bei solch kleinen Klassen kann der Speicher eigentlich nicht ausgehen.
Wenn du sehr viel Speicher anforderst macht das aber auch wieder Sinn.
-
Ok, Danke!
-
Hab auch eine Frage.
auto_ptr<TPanel> Panel(new TPanel(this)); //TPanel *Panel = new TPanel(this); Panel->Parent = ScrollBox1; Panel->Align = alTop; Panel->Height = 200;
Der Code bewirkt garnichts. Tausche ich aber die Zeile auto_prt mit der "normalen" Variante aus, dann geht es und ich sehe in der ScrollBox ein Panel. Kann mir jemand sagen was ich falsch mache? Auch in der normalen Version muss man sich aber nicht um das löschen (delete) kümmern, da dies von der Form bzw Scrollbox erledigt wird, richtig?
-
Ich bin ja doof, der löscht das natürlich am Ende der Funktion bei auto_ptr. *feix*
-
Eine auto_ptr Instanz wird ungültig wenn sie ihren Scope verlässt. Es könnte sein, das dein auto_ptr zu lokal ist.
-
ptrus schrieb:
Nabend.
Ich habe hier ein funktionierendes VC6 Projekt das ich in BCB5 übernehmen möchte.
auto_ptr<char> m_apKey; m_apKey = auto_ptr<char>(new char[m_keylength]);
Jetzt bekomme ich leider den Fehler:
E2285 Keine Übereinstimmung für 'auto_ptr<char>::operator =(auto_ptr<char>)' gefunden
Sieht wer den Fehler und kann diesen mir bitte benennen?
VC6 klappts, aber BCB5 will nicht.
Ist zwar schon älter, aber es ist doch bezeichnend, dass irgendwie keiner der verbreiteten Compiler (vc++, bcb, gcc) in der Lage ist, einen korrekten auto_ptr anzubieten.
-
Sollte das überhaupt gehen?
Immerhin wird hier ein Array an einen auto_ptr gebunden der dann ja nicht das korrekte delete bereitstellen sollte.
Der BCB5 ist allerdings schon recht alt. Der BCB2007 compiliert das.
-
Braunstein schrieb:
Sollte das überhaupt gehen?
Immerhin wird hier ein Array an einen auto_ptr gebunden der dann ja nicht das korrekte delete bereitstellen sollte.
Der BCB5 ist allerdings schon recht alt. Der BCB2007 compiliert das.Natürlich ist die Geschichte undefiniert, aber die Fehlermeldung indiziert, dass auch ein
m_apKey = auto_ptr<char>(new char);
fehlschlagen würde.
-
Ich habs mit get() ausprobiert, leider ohne erwarteten Erfolg.
auto_ptr<TIniFile> ini(new TIniFile(Folder)); if (!ini.get()) ShowMessage("Error");
Ich kann einen gültigen Pfad setzen oder irgendwas, er zeigt mir nie die ShowMessage an.
-
Hallo
ja was erwartest du denn auch? Die Abfrage mit dem get() bringt nur die Unterscheidung ob NULL oder nicht NULL. Damit kannst du aber nicht überprüfen ob die Instanz irgendwelche inhaltlichen Fehler liefert.
Da new immer gültige Instanzen und damit Adressen liefert (es sei denn der Speicher kann nicht reserviert werden) schlägt die Abfrage immer fehl, da danach immer eine Adresse ungleich NULL im auto_ptr steht. Das ist auch kein "Fehler" des auto_ptr.
Wie du konkrete Fehler bei TIniFile abfragen kannst must du schon in der BCB-Hilfe nachlesen.bis bald
akari
-
akari schrieb:
Da new immer gültige Instanzen und damit Adressen liefert (es sei denn der Speicher kann nicht reserviert werden)
und dann wird eine Exception geworfen. So oder so ist die Abfrage Unsinn.
-
Kann man nicht auf new(nothrow) verwenden, mit dem Resultat, dass statt einer Exception ein NULL-Zeiger zurückgegeben wird?
-
kann man, aber warum?
Wenn kein Speicher mehr da ist, ist der normale Programmablauf doch sowieso schwer gestört. Wenn das kein Grund für eine Exception ist, was dann?