delete ptr



  • Hi,

    mein Programm gibt zwar den gewünschten Output, stürzt dann aber ab:

    #include<iostream>
    #include<cstdlib>
    #include<string>
    using namespace std;
    
    int main(){
    	int *ptr=NULL;
    	int antwort=0;
    	cout << "Reservieren? (1) ja, (2) nein: ";
    	cin >> antwort;
    	if(antwort == 1){
    		ptr = new int[20];
    	}
    	for(int i=0; i<20; i++){
    		*(++ptr)=i;
    		cout << *ptr << " " << ptr << endl;
    	}
    	//ptr = NULL;
    	delete ptr;
    	return 0;
    }
    

    Wenn ich den Pointer ptr wieder auf NULL setze, bevor ich den Speicher wieder freigebe, dann funktionierts.

    Dann hab ich noch eine allg. Frage zu ptr = new int[20]:
    Ich verstehe das so: es wird Speicher reserviert, der für einen Array mit 20 int-Werten ausreicht. Aber wie kann ich dann auf den Speicher zugreifen? Mein Array hat ja noch keinen Namen wie
    int a[20];
    a[5]=5;
    Drücke ich mein Problem verständlich aus?

    Danke für die Hilfe,
    nbt 🙂



  • nbt schrieb:

    Wenn ich den Pointer ptr wieder auf NULL setze, bevor ich den Speicher wieder freigebe, dann funktionierts.

    Ne, dann beendets zwar ohne crash aber du hast nichts gelöscht.

    Du erhöhst den pointer in der Schleife. Du kannst nicht einfach irgendeine andere Adresse löschen als du vom new bekommen hast, und erwarten dass C++ weiß wo der mal herkam. Du musst dir die Originaladresse (Den Originalen Pointer) zwischenspeichern bzw. einen temporären erstellen um diesen in der Schleife zu erhöhen.

    Edit: Prefixincrement ist ohnehin falsch.



  • *(++ptr)=i; -> *(ptr + i) = i;



  • Oder eben ptr[i] = i;



  • Davon mal abgesehen: Warum machst du überhaupt manuelle Speicherverwaltung? Das ist unnötig kompliziert und fehleranfällig. Nimm einen std::vector.



  • Und mach delete[] ptr . Die eigentliche Ursache des Absturzes wurde ja schon geklärt.


Log in to reply