new und Initialisierung
-
Hmm, Okay.
Kann man aber zumindest die komplette Größe des reservierten Speichers bekommen, ohne die Anzahl an Elementen angeben zu müssen?
Also ein Alternative für das:
bool *buffer = new bool[1000]; buffersize = sizeof(bool)*1000;
Danke!
-
Gurkä schrieb:
Kann man aber zumindest die komplette Größe des reservierten Speichers bekommen, ohne die Anzahl an Elementen angeben zu müssen?
AFAIK nicht (jedenfalls nicht auf standardkonformem Weg), aber verwende doch einfach das vector-Klassentemplate aus der STL.
Wenn du das mit dem Initialisieren häufiger machen mußt, würde ich ein entsprechendes Makro definieren (ja, ich weiß, das Makros unsicher, fehleranfällig usw. sind, aber manchmal sind sie einfach praktisch):
#define NEW_SET(type,var,dim,init) var = new type[dim]; \ for (type* __sptr_ ## var = var; __sptr_ ## var < var + dim; (*(var++)) = init); ... int* pi; NEW_SET (int, i, 1000, 23); // alloziert 1000 ints und initialisiert mit 23 ... delete [] i; // wir sind ja ordentlich :D
(natürlich nur sinnvoll, wenn du vector nicht verwenden kannst oder willst)
Moritz
-
Danke für deinen Vorschlag.
Finde es aber schon recht doof dass der Compiler die Größe des reservierten Speichers kennt (delete[] ...;), man sich aber selber die Größe zusammenrechnen muß.
-
Kennt C++ also keine Alternative zu calloc()? Schade eigentlich...
-
Gurkä schrieb:
Finde es aber schon recht doof dass der Compiler die Größe des reservierten Speichers kennt (delete[] ...;), man sich aber selber die Größe zusammenrechnen muß.
Stimmt. Im Prinzip kannst du das auch nachschauen, wenn du weißt, wie dein Compiler das abspeichert (meistens direkt vor dem allozierten Speicher; deswegen ist eine Unterscheidung zwischen delete und delete [] erforderlich) - das Verfahren ist aber AFAIK nicht vom Standard festgelegt (wird mal Zeit ;)) und kann von Compiler zu Compiler unterschiedlich sein.
Moritz
-
TactX schrieb:
Kennt C++ also keine Alternative zu calloc()? Schade eigentlich...
calloc ist keine gute Lösung in C++ (nur für eingebaute Datentypen); ein Äquivalent ist der schon erwähnte std::vector.
Moritz
-
audacia schrieb:
TactX schrieb:
Kennt C++ also keine Alternative zu calloc()? Schade eigentlich...
calloc ist keine gute Lösung in C++
Deswegen schrieb ich auch Alternative
-
TactX schrieb:
audacia schrieb:
calloc ist keine gute Lösung in C++
Deswegen schrieb ich auch Alternative
Die hast du ja auch bekommen...
-
audacia schrieb:
Wenn du das mit dem Initialisieren häufiger machen mußt, würde ich ein entsprechendes Makro definieren
Ich nicht, dein Beispiel lässt sich auch problemlos mit 'ner Funktion realisieren, notfalls noch inline.
Gurkä schrieb:
Finde es aber schon recht doof dass der Compiler die Größe des reservierten Speichers kennt (delete[] ...;), man sich aber selber die Größe zusammenrechnen muß.
Wieso zusammenrechnen? Du hast sie doch angegeben, was also hindert dich daran, sich das einfach zu merken. Und komfortabler geht es, wie bereits erwähnt, mit Containern ala std::vector.
TactX schrieb:
Kennt C++ also keine Alternative zu calloc()?
Nein. Wozu auch? calloc ist ja nichts weiter als malloc + memset. Und Bereichsalgorithmen findest du auch in <algorithm>.
-
audacia schrieb:
Gurkä schrieb:
Kann man aber zumindest die komplette Größe des reservierten Speichers bekommen, ohne die Anzahl an Elementen angeben zu müssen?
AFAIK nicht (jedenfalls nicht auf standardkonformem Weg)
template<class T, size_t n> inline size_t Size(T[n]) { return n; }
-
Michael E. schrieb:
template<class T, size_t n> inline size_t Size(T[n]) { return n; }
#include <iostream> template <typename T, size_t n> inline size_t arraysize(T[n]) { return (n); } int main (void) { int* h = new int[12]; std::cout << arraysize (h) << std::endl; delete [] (h); return (0); }
Stellst du dir das so vor? Bei mir geht das jedenfalls nicht ("Keine Übereinstimmung für 'arraysize<T,n>(int *)' gefunden"), ohne daß man Parameter n in dem Aufruf explizit angäbe, womit die Funktion wiederum sinnlos wäre.
Moritz
-
Dann gehts wohl nur bei "echten" Arrays.
-
Michael E. schrieb:
Dann gehts wohl nur bei "echten" Arrays.
Meinst du so:
#include <iostream> template <typename T, size_t n> inline size_t arraysize(T[n]) { return (n); } int main (void) { int s[23]; std::cout << arraysize (s) << std::endl; return (0); }
Auch so geht es bei mir nicht (gleicher Fehler)!
Moritz
-
So müßte es gehen:
template <typename T, size_t n> inline size_t arraysize(T (&)[n]) { return n; }
-
fubar schrieb:
So müßte es gehen:
template <typename T, size_t n> inline size_t arraysize(T (&)[n]) { return n; }
Aber auch nur mit "echten" Arrays...