Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Heap-allokierten Dateinamen Stream "weglöschen" sicher?

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
13.04.2015, 17:18 Uhr
banshee



Simple Frage: Ist das hier erlaubt?


C++:
char* filename = new char[512];
strcpy(filename, "whatever.txt");
std::ifstream ifs(filename);
delete[] filename;  // ???

// work on the file

ifs.close();


Wie finde ich so was denn selbst raus? In der Doku steht nichts darüber und im Code der Standard-Lib wird der Dateiname irgendwann an eine externe Funktion übergeben, d.h. ich sehe also nicht mehr, was damit passiert. Das Argument ist zumindest const char*, was ja dafür spricht, dass der Dateiname intern selbst kopiert wird, sofern er denn überhaupt benötigt wird.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
14.04.2015, 20:50 Uhr
Hans
Library Walker
(Operator)


Hi,

hast Du mal ausprobiert, ob es funktioniert? - Und sei es, mit dem geposteten Beispielcode?
Ansonsten würde ich mit einem Debugger oder etwas ähnlichem verfolgen, wo der Dateiname letztlich bleibt. Es gibt doch bestimmt auch Tools, um den Datenfluss eines Programms zu analysieren...

Hans
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
14.05.2015, 21:12 Uhr
banshee



Vermutlich ist es sicher, und funktionieren tut das obige auch. Ich hätte eben nur gerne 100%ige Sicherheit gehabt, weil es z.B. von offizieller Seite irgendwo so dokumentiert ist. Am Ende wird oben nämlich noch aus den bereits freigegebenen, aber noch nicht reallokierten Speicherresten gelesen und schmiert dann eben doch mal ab, wenn man sich fälschlicherweise drauf verlässt.

Andererseits, wenn das char array a) wirklich für die gesamte Lebensdauer des Streams gültig sein müsste und b) der Stream dann nicht mal die Verwaltung übernimmt und es in seinem Destruktor löscht, dann wäre das vermutlich mit Sicherheit irgendwo dokumentiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
16.05.2015, 09:19 Uhr
~f.-th.
Gast


Brauchst du diese alte Schule Variante von Filename?

Oder was spricht gegen:

C++:
std::string filename ="whatever.txt";
std::ifstream ifs(filename);



Musst eventuell den Compiler auf C++11 einstellen.

MfG f.-th.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
18.05.2015, 08:58 Uhr
ao

(Operator)


Die grundsätzliche Frage ist doch: Ist irgendwo festgelegt, ob das Hilfsobjekt, welches den Filenamen in den ifstream hineintransportiert (sei das nun ein std::string oder ein char-Array), während der gesamten Lebenszeit des Stream-Objekts gültig sein muss oder nur während der Laufzeit des Konstruktors?

In diesem trivialen Fall kriegt man es mit einem lokalen std::string-Objekt sicher hin, aber im allgemeinen kommt der Filename ja von weiter her, und dann wirds kompliziert. Ich bin mir daher sicher, dass "Laufzeit des Konstruktors" reicht, weil es eine ziemliche Unverschämtheit wäre, das andere dem Anwendungsprogrammierer aufzuhalsen.

In der Doku zu std::ifstream habe ich nichts dazu gefunden, aber es kann auch sein, dass das in irgendwelchen grundsätzlichen Kapiteln zur iostream-lib abgehandelt wird, weil es die anderen Klassen ja genauso betrifft.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
19.05.2015, 14:58 Uhr
~Mr.KA
Gast


@banshee
Also prinzipiell:
Von einer Bibliothek (wie z.B. std) darf man erwarten, dass sie die benötigten Daten in der Klasse selbst hält und sich nicht darauf verlässt, dass ein irgendein Pointer der von einem Anwender hereingereicht wird, genügend lange gültig ist (Ausnahme: Es ist ausdrücklich dokumentiert, dass der übergebene Pointer zur Lebenszeit des Objekts oder während der Ausführung einer bestimmten Methode gültig sein muss).

Falls die std-Bibliothek davon ausgehen würde, dass der File-Name während der Lebenszeit eines ifstream-Objekts wichtig wäre, würde das ifstream Objekt sicher ein Member haben um diesen Namen darin zu kopieren; dann würde vermutlich auch noch eine Methode GetFileName() oder sowas geben.
Der File-Name wird aber nur während einer atomaren Operation benötigt:
Entweder in open(filename, mode) oder eben wie oben erwähnt im Konstruktor, der in diesem Fall auch sofort versucht die Datei zu öffnen.
Es besteht somit für die Klasse ifstream keine Notwendigkeit den Namen der Datei zu speichern.
Schau dir dazu mal www.cplusplus.com/reference/fstream/ifstream/ an.
Bzw. öffne doch mal den header in welchem ifstream deklariert ist: da ist kein Member für den Dateinamen, da dieser im weiteren nicht benötigt wird.
Somit brauchst du dir auch keine Gedanken machen, ob der übergebene Parameter noch weiter verwendet bzw. benötigt wird.
Hoffe das hilft dir.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: