Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.de  
   

Die mobilen Seiten von c++.de:
http://m.c-plusplus.de
Infos hier [BETA]

  
c++.de :: VCL (C++ Builder) ::  auto_ptr  
Gehen Sie zu Seite 1, 2  Weiter
  Zeige alle Beiträge auf einer Seite
Auf Beitrag antworten
Autor Nachricht
rudpower
Mitglied

Benutzerprofil
Anmeldungsdatum: 04.11.2009
Beiträge: 539
Beitrag 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: 5703
Beitrag 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: 1828
Beitrag 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: 11306
Beitrag 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: 6008
Beitrag 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: 11306
Beitrag 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
Beitrag 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: 257
Beitrag 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: 6865
Beitrag Braunstein Mitglied 17:03:25 05.03.2012   Titel:              Zitieren

Der BCB5 arbeitet ganz brauchbar mit boost 1.34 zusammen.
Unter folgendem Link findet man ein Kompatibilitätspaket dafür.
http://sourceforge.net/projects/bcbboost/files/bcbboost-1_34_0-5_9_0/0.1/
Bei Verwendung von boost wäre hier statt shared_ptr eher scoped_ptr geeignet.
_Stephan_
Mitglied

Benutzerprofil
Anmeldungsdatum: 07.04.2009
Beiträge: 137
Beitrag _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.
c++.de :: VCL (C++ Builder) ::  auto_ptr  
Gehen Sie zu Seite 1, 2  Weiter
Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben.
Sie können auf Beiträge in diesem Forum antworten.
Sie können Ihre Beiträge in diesem Forum nicht bearbeiten.
Sie können Ihre Beiträge in diesem Forum nicht löschen.
Sie können an Umfragen in diesem Forum nicht mitmachen.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.de ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info und www.c-plusplus.net enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.