| Autor |
Nachricht |
rudpower
Mitglied
Benutzerprofil
Anmeldungsdatum: 04.11.2009
Beiträge: 539
|
rudpower Mitglied
14:11:18 05.03.2012 Titel: |
auto_ptr |
Zitieren |
ich verwende folgende Funktion um die Ports der seriellen Schnittstellen auszulesen:
| C++: | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 | void TfrmMain::LoadPorts(TStrings* portliste)
{
TStringList* keys(new TStringList());
std::auto_ptr<TRegistry> registry(new TRegistry);
registry->Access = KEY_READ;
registry->RootKey = HKEY_LOCAL_MACHINE;
registry->OpenKey("HARDWARE\\DEVICEMAP\\SERIALCOMM\\", false);
registry->GetValueNames(keys);
portliste->Clear();
for(int i=0;i<keys->Count;i++)
portliste->Add(registry->ReadString(keys->Strings[i]));
registry->CloseKey();
delete keys;
} | |
Um Memory Leaks zu vermeiden wurde mir empfohlen Autopointer zu verwenden. Im Forum hier wurde mir aut_ptr empfohlen. Im C++Buch von Kaiser steht, dass der shared_ptr bevorzugt werden soll. Einzubinden ist dieser mit:
| C++: | #include <boost/shared_ptr.hpp>
using boost::shared_ptr; | |
Dies erzeugt bei mir leider folgende Fehlermeldungen:
| Code: | [C++ Fehler] unitMain.cpp(18): E2209 include-Datei 'boost/shared_ptr.hpp' kann nicht geöffnet werden.
[C++ Fehler] unitMain.cpp(19): E2090 Qualifizierer 'boost' ist kein Name einer Klasse oder einer Struktur
[C++ Fehler] unitMain.cpp(19): E2272 Bezeichner erwartet | |
Kann ich das in der Zeile: | C++: | | std::auto_ptr<TRegistry> registry(new TRegistry); | | mit dem auto_ptr so machen?
Die Stringliste hätt ich auch gern mit einem Autopointer erstellt. Das funktioniert aber nicht, da die Zeile | C++: | | registry->GetValueNames(keys); | | eine Adresse erwartet und dann einen Fehler ausspuckt:
| Code: | | [C++ Fehler] unitMain.cpp(50): E2342 Keine Übereinstimmung des Typs beim Parameter 'Strings' ('TStrings *' erwartet, 'std::auto_ptr<TStringList>' erhalten) | |
Oder macht es hier vielleicht gar keinen Sinn Autopointer einzusetzen? |
_________________ Computer dienen uns zur Lösung von Problemen, die wir ohne sie nicht hätten.
|
|
 |
LordJaxom
Mitglied
Benutzerprofil
Anmeldungsdatum: 23.11.2005
Beiträge: 5697
|
LordJaxom Mitglied
14:15:23 05.03.2012 Titel: |
|
Zitieren |
Hast Du boost denn überhaupt installiert und in den Buildprozess eingebaut? Wenn nicht, kann er den shared_ptr von boost auch nicht finden
Ja, es macht Sinn, Smartpointer zu verwenden, da Du nicht in die Falle tappen kannst, ein delete zu vergessen. Am Beispiel Deiner Stringliste sieht man es, dort hast Du es nämlich vergessen. Ich meine damit nicht das "delete keys" am Ende der Funktion, das ist natürlich ok, aber wenn einer der Aufrufe davor eine Exception wirft, wird dieses delete nie erreicht.
registry->GetValueNames(keys) kann nicht funktionieren, wenn keys ein auto_ptr<TStringList> ist, da ein TStringList* erwartet wird. Aber um aus einem Smartpointer (egal welcher Art) wieder einen rohen Zeiger für die Übergabe an solche APIs zu machen, gibt es ein gängiges Idiom: &*keys (mit *keys machst Du aus dem auto_ptr<TStringList> ein TStringList& und mit dem & machst Du aus dem TStringList& ein TStringList*). |
|
|
|
 |
DocShoe
Mitglied
Benutzerprofil
Anmeldungsdatum: 02.04.2008
Beiträge: 1814
|
DocShoe Mitglied
14:16:50 05.03.2012 Titel: |
|
Zitieren |
Welche BCB Version benutzt du? Die boost Bibliotheken sind erst ab 2009 dabei, wenn du einen älteren Compiler benutzt musst du sie erst selbst übersetzen (v1.34_2 ist da aber Ende der Fahnenstange).
Zum eigentlichen Problem:
| C++: | | Registry->GetValueNames() | |
erwartet Parameter welchen Typs? Und was übergibst du? Du solltest mal einen Blick in die Hilfe werfen, da steht alles drin, um dein triviales Problem zu lösen.
Edit:
zu langsam |
_________________ Die fünf häufigsten Anzeichen für Faulheit:
1.
Zuletzt bearbeitet von DocShoe am 14:17:44 05.03.2012, insgesamt 1-mal bearbeitet |
|
 |
akari
Moderator
Benutzerprofil
Anmeldungsdatum: 27.11.2004
Beiträge: 11305
|
akari Moderator
14:22:32 05.03.2012 Titel: |
|
Zitieren |
Hallo
In deinem Fall ist std::auto_ptr auch ausreichend.
Eine Alternative zu &* ist noch die Methode get :
| C++: | | registry->GetValueNames(keys.get()); | |
bis bald
akari |
_________________ In der nächsten Version wird alles besser!
|
|
 |
knivil
Mitglied
Benutzerprofil
Anmeldungsdatum: 11.02.2009
Beiträge: 5854
|
knivil Mitglied
14:30:45 05.03.2012 Titel: |
|
Zitieren |
| Zitat: | | Im Forum hier wurde mir auto_ptr empfohlen. | Sicher? Schon lange vor dem neuen Standard wurde davon abgeraten. |
_________________ If it were not for laughter, there would be no Tao.
Sie können einen Beitrag nicht so schnell nach Ihrem letzten absenden, bitte warten Sie einen Augenblick.
|
|
 |
akari
Moderator
Benutzerprofil
Anmeldungsdatum: 27.11.2004
Beiträge: 11305
|
akari Moderator
14:48:58 05.03.2012 Titel: |
|
Zitieren |
Hallo
Man muß davon abraten, std::auto_ptr außerhalb der vorgesehenen Möglichkeiten zu benutzen. Gegen eine sachgemäße Benutzung wie in diesem Fall ist nichts einzuwenden. Gerade bei der VCL kann man den auto_ptr gut gebrauchen, weil viele Klassen keine Stackinstanzen zulassen, auch wenn konkret keine größere Gültigkeit gebraucht wird.
bis bald
akari |
_________________ In der nächsten Version wird alles besser!
|
|
 |
rudpower
Mitglied
Benutzerprofil
Anmeldungsdatum: 04.11.2009
Beiträge: 539
|
rudpower Mitglied
16:37:31 05.03.2012 Titel: |
|
Zitieren |
ich verwende den Borland Builder 5. Den boost hab ich nicht installiert. Ist das bei dieser Version überhaupt möglich bzw. erforderlich? |
_________________ Computer dienen uns zur Lösung von Problemen, die wir ohne sie nicht hätten.
Zuletzt bearbeitet von rudpower am 16:41:45 05.03.2012, insgesamt 1-mal bearbeitet |
|
 |
nn
Mitglied
Benutzerprofil
Anmeldungsdatum: 02.10.2011
Beiträge: 251
|
nn Mitglied
16:49:41 05.03.2012 Titel: |
|
Zitieren |
| rudpower schrieb: | | Ist das bei dieser Version überhaupt möglich bzw. erforderlich? |
Für so eine Anwendung, wo ein Zeiger auf ein VCL-Objekt innerhalb einer Funktion verwaltet werden soll, reicht auto_ptr völlig aus. Das war zu Zeiten des C++ Builders 5/6 so üblich und es dürfte ziemlich viel Code geben, wo das vorkommt.
Das auto_ptr wegen seiner Designschwächen in modernem C++ nicht mehr verwendet werden sollte, ist mir auch klar. Aber mit dem BCB5 schreibt man kein modernes C++.
Wenn man trotzdem mit Boost arbeiten will, muss man in der Tat sehen mit welcher (alten) Version das geht. Installieren muss man Boost dazu aber nicht, es reicht es irgendwohin zu entpacken. Die Smartpointer sind laut Boost-Webseite header-only und seit Version 1.23 dabei. |
|
|
|
 |
Braunstein
Mitglied
Benutzerprofil
Anmeldungsdatum: 16.05.2002
Beiträge: 6859
|
Braunstein Mitglied
17:03:25 05.03.2012 Titel: |
|
Zitieren |
|
 |
_Stephan_
Mitglied
Benutzerprofil
Anmeldungsdatum: 07.04.2009
Beiträge: 130
|
_Stephan_ Mitglied
08:11:59 06.03.2012 Titel: |
|
Zitieren |
Kann jemand etwas zu denn Nachteilen des auto_ptr schreiben bzw verlinken?
Mir ist momentan nämlich nicht klar warum dieser nicht mehr verwendet werden soll, bzw. wo die schwächen liegen und was als Ersatz dienen soll.
Sorry für die eventuell dumme Frage?
Danke. |
|
|
|
 |