Heap Error nach delete
-
Warum verursacht das Programm einen Heap-Fehler?
#include <iostream> using namespace std; bool function(char *); int main (int argc, char *argv) { char *POINTER = new char[]; cin >> POINTER; function(POINTER); cin.sync(); cin.get(); delete [] POINTER; return 0; } bool function(char *POINTER) { cout << POINTER << endl; return 1; }
-
> char *POINTER = new char[];
Soll sich das Programm aussuchen, wie viel Speicher du brauchst?
-
char *POINTER = new char[]; ^^ Du musst dem Compiler auch sagen, wieviel Speicher er anfordern soll
-
Ad aCTa schrieb:
> char *POINTER = new char[];
Soll sich das Programm aussuchen, wie viel Speicher du brauchst?
Äh, ich dachte immer,
dass das das
tolle am dynamischen allokieren ist xD
-
Wie soll dass denn funktionieren?
Was für einen Compiler benutzt du denn?
Mein GCC 4.4.0 kompiliert das nichtmal :).
-
blub² schrieb:
Wie soll dass denn funktionieren?
Was für einen Compiler benutzt du denn?
Mein GCC 4.4.0 kompiliert das nichtmal :).MS Visual C++ 2008
Genau das hat mich auch verwirrt...
-
Dann wirf doch mal bitte einen Blick in deine Signatur. Das tolle am
operator new
ist, dass die Zahl, die du angeben musst, nicht konstant sein muss.int i = 5; int array1[i]; // geht nicht! int* array2 = new int[i]; // geht sehr wohl delete [] array2;
Deshalb ist es dynamisch: es muss zur Compile-Zeit nicht feststehen, wie viel Speicher du brauchst, zur Runtime aber logischerweise schon.
-
Bedeutet das man gibt vorher zb ein, wieviele buchstaben man bei einem char-array braucht?
also erst wird wie in deinem beispiel i eingegeben und dann dementsprechend die zeichenkette eingegeben?
praktisch so:
int i = 0; cin >> i; char *POINTER = new char[i]; cin >> POINTER;
??
-
Zum Beispiel ja.
Oder du würfelst eine Zahl mit random() aus, oder du allokierst Speicher entsprechend der Länge einer Datei, oder oder oder...Du kannst einfach zur Laufzeit eine beliebige Zahl reinfüttern (solange du genug Speicher hast, aber dem Durchschnittsprogramm geht heutzutage der Speicher nichtmehr aus).
-
Noch viel besser: du nimmst einfach strings statt char-Arrays.
-
blub² schrieb:
Zum Beispiel ja.
Oder du würfelst eine Zahl mit random() aus, oder du allokierst Speicher entsprechend der Länge einer Datei, oder oder oder...Du kannst einfach zur Laufzeit eine beliebige Zahl reinfüttern (solange du genug Speicher hast, aber dem Durchschnittsprogramm geht heutzutage der Speicher nichtmehr aus).
Wie kriege ich die Länge einer beliebigen Datei heraus? Muss ich das mit der API des jew. Betriebssystems machen oder gibts dafür bei C/C++ selbst möglichkeiten? ZB die Länge der AcrobatReader.exe.
-
<ot>
skullyan @ Februar 2009 schrieb:
Hab mich entschlossen, C++ zu lernen. Möchte es mir autodidaktisch selbst beibringen. Habe vor, C++ professionell zu verwenden [...]
Du hast (hattest?) den Anspruch es "professionell zu verwenden". Das impliziert meiner Meinung nach, dass man sich Lehrbücher organisiert. Du wärst wahrscheinlich schon viel weiter mit einem guten Lehrbuch. *mit-dem-zaunpfahl-wink*
</ot>
-
Ja, das geht:
std::fstream fs("AcrobatReader.exe", ios::in | ios::binary); fs.seekg(0, ios::end); int length = fs.tellg(); fs.close();
-
blub² schrieb:
Ja, das geht:
std::fstream fs("AcrobatReader.exe", ios::in | ios::binary); fs.seekg(0, ios::end); int length = fs.tellg(); fs.close();
Super, danke.
-
skullyan schrieb:
Bedeutet das man gibt vorher zb ein, wieviele buchstaben man bei einem char-array braucht?
Nein, das bedeutet, man benutzt eine Klasse, sodass man sich nicht mehr um die Speicherverwaltung kümmern muss.
std::string
wurde sogar schon genannt.