leicht
-
leichte frage
ich will einen auto_ptr der auf ein Array zeigt erzeugen, die größe des Arrays ist nicht konstant und ich will über den indexoperator[] auf das array zugreifen können (mit malloc hab ich leider weis ich den genauen syntax für new nicht)
hab mir das so gedacht:
int groesse = 4; auto_ptr<BYTE> Cache( new BYTE(groesse));
leider kann ich dann folgendermaßen nicht auf das array zugreifen
Cache[2] = 1;
kann mir da bitte wer helfen
-
auto_ptr ist für Arrays nicht geeignet.
-
std::vector<BYTE> bytes;
-
/edit: zu langsam
-
hab auch schon überlegt ob ich es mit einem vector machen soll, hab mir heute erst auto_ptr angesehen und fand das eigentlich sehr gut
-
schön. aber nicht passend für dich aufgabe.
-
Hallo,
man muss hier zwei Dinge berücksichtigen:
1.leicht schrieb:
auto_ptr<BYTE> Cache( new BYTE(groesse));
Hier allokierst du kein Array der Größe groesse sondern genau *ein* BYTE, dass mit dem Wert groesse initialisiert wird.
Array-new erwartet die eckigen Klammern [].2. auto_ptr ruft delete, nicht delete [] auf, ist für Arrays also ungeeignet.
Mehr zum Thema: http://fara.cs.uni-potsdam.de/~kaufmann/?page=GenCppFaqs&faq=auto_ptr#Answ
-
das könnte man ja eigentlich leicht lösen indem man ein klasse von auto_ptr ableitet und denn destruktor umschreibt, bei den anderen methoden sollte ja eigentlich keine Probleme auftreten oder?
(ich kann mir schon vorstellen das auto_ptr nicht für arrays geeignet ist aber ich wills halt nur mal ausprobieren)
-
viel spaß dabei
-
Wenn du nur mal ein bisschen rumprobieren willst, dann kannst dir auch mal boost::scoped_array anschaun.
-
leicht schrieb:
das könnte man ja eigentlich leicht lösen indem man ein klasse von auto_ptr ableitet und denn destruktor umschreibt
Das wäre keine gute Idee.
Probleme:
1. Der Destruktor von auto_ptr ist nicht virtuell
2. Gängige Usage-Patterns von auto_ptr basieren auf "by-value"-Übergabe bzw. Rückgabe:void sink(auto_ptr<T> a); // irgendwo array_auto_ptr<T> p(new T[5]); sink(p); // Ups!
3. Die Implementation der Ownership-Semantik ist alles andere als leicht. Und bei einem standardkonformen auto_ptr müsstest du zusätzlich noch die Colvin/Gibbons-Helper (auto_ptr_ref) implementieren, was auch ales andere als trivial ist.
Dann doch lieber eine Delete-Adapter.Aber warum krampfhaft an auto_ptr festhalten, wenn man mit std::vector genau das hat, was du brauchst?
-
Ableiten würde ich nicht von auto_ptr, aber man kann sich ja eine Kopie vom auto_ptr-Code machen und z.B. auto_array nennen. So mache ich es zumindest, wenn ich das brauche.
-
naja ich will mich ja nicht krampfhaft an auto_ptr festhalten wollts nur ein bisschen rumprobieren