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.


Log in to reply