Speicher auf dem Heap reservieren
-
Die Regel heißt doch, wenn eine größe einer Variable zur Laufzeit noch unklar ist, dann muss man sie auf dem Heap Speichern. Oder?
Folgendes Beispiel:#include <iostream> using namespace std; class Prime { public: explicit Prime(); ~Prime(); inline unsigned long NextPrime(unsigned long value); private: unsigned long m_PrimeNumber; }; Prime::Prime() :m_PrimeNumber(1) { } Prime::~Prime() { } unsigned long Prime::NextPrime(unsigned long value) { unsigned long array[value]; return value; } int main() { Prime temp; unsigned long choice; cin >> choice; temp.NextPrime(choice); return 0; }Eigentlich müsste das doch einen Compiler Error geben? Was genau passiert heir im Speicher, weil die Größe von "array[....]" ist ja noch unklar?!
Das verwirrt mich jetzt gard irgendwie. Müsste man da nicht "unsigned long array*=new unsigned long [value]" machen? Aber warum meldet sich der Compiler nicht?
Kann mir jemand das mit dem Speicher nochmal erklären?MfG
Stromberg
-
Folgende Fehler meldet der MSVC:
1>.\main.cpp(11) : error C2057: Konstanter Ausdruck erwartet 1>.\main.cpp(11) : error C2466: Zuordnung eines Arrays der konstanten Größe 0 nicht möglich. 1>.\main.cpp(11) : error C2133: 'array': Unbekannte GrößeIch weiß, dass soetwas in C erlaubt ist, in C++ aber nicht. Und dein Code ist eindeutig C++.
Gruß
Don06
-
Mh, ich kann das aber ohne Compilerfehler compilieren. (MinGW)
Aber mich wundert das jetzt auch irgendwie...mh?MfG
Stromberg
-
Hi,
nach ISO C++ tut er das auch:
g++ blah.cpp -o blah -pedantic
blah.cpp: In member function 'long unsigned int Prime::NextPrime(long unsigned int)':
blah.cpp:28: error: ISO C++ forbids variable-size array 'array'
-
Der GCC/MinWG unterstützt Variable-Sized-Arrays (zumindest in der Vesion 4.2.1 die ich bei mir hab) obwohl sie nicht im ISO-Standard enthalten sind. Wenn du dem Compiler das Flag -pedantic mitgibst bekommst du einen Fehler "ISO-C++ forbids variable-sized arrays".
-
Otimiert der MinGW Compiler den Code dann einfach und hauts auf n Heap? Kann ich diese Falg irgendwie dauerhaft einschalten (Code::blocks), geht das irgendwie, das wär doch besser wenn das an wäre oder?
-
Stromberg schrieb:
Otimiert der MinGW Compiler den Code dann einfach und hauts auf n Heap? Kann ich diese Falg irgendwie dauerhaft einschalten (Code::blocks), geht das irgendwie, das wär doch besser wenn das an wäre oder?
Settings -> Compiler and debugger -> Compiler Settings -> das Kästchen für -pedantic aktivieren (und am besten auch noch -Wall)
-
Ahhh...Dankeschön, jetzt rührt sich was wenn ich es nicht auf den Heap haue.
MfG
Stromberg
-
Stromberg schrieb:
Otimiert der MinGW Compiler den Code dann einfach und hauts auf n Heap?
Nein, auf dem Stack. Technisch gesehen ist das garnichtmal schwierig, nur eben in C++ nicht vorgesehen.
-
nicht alles was c++ verbietet oder nicht kann hat seine ursache darin, dass es nicht ginge. häufig hat es seine ursache schlicht darin, dass die sprache sowas nicht vorsieht

deshalb können manche compiler auch mehr, als der standard vorsieht. ist auch nicht falsch, funktionalität seines compilers auszunutzen und am standard vorbeizucoden. man muss sich dann aber im klaren sein, dass man nicht mehr nach iso standard entwickelt und der gesamte code möglicherweise überarbeitet werden muss, wenn auch nur auf eine neue compilerversion umgestiegen wird.
-
Was liefert denn sizeof() angewendet auf so ein "dynamisches" Array. Im Standard steht ja, dass sizeof() beim Kompilieren berechnet wird, oder soetwa in der Art. Liefert es dann nur die Größe eines Zeigers oder wurde auch die Funktionalität von sizeof() geändert?
Hab gerade nicht den GCC bei Hand.Gruß
Don06
-
Don06 schrieb:
Was liefert denn sizeof() angewendet auf so ein "dynamisches" Array.
sehr wahrscheinlich dasselbe wie sizeof(int) ^^
ich nehms zurück. das ding liegt tatsächlich aufm stack.