Dynamischer Speicher nicht richtig freigegeben?



  • Hallo,

    ich habe das Problem das bei meinem Programm der DELETE[] im Destruktor nicht richtig funktioniert. 😕

    Jedenfalls erscheint nach einem Durchlauf des Programms immer diese Fehlermeldung:
    "DAMAGE: after normal block (#71) at 0x004918A0"

    Hier mein Programm:

    *** Klasse.h: ***

    class SAVE_ARRAY
    {
    	private:
    		int anz;
    		double *Element;
    
    	public:
    		SAVE_ARRAY(int anzahl);
    		~SAVE_ARRAY();			
    };
    

    *** Klasse.cpp ***

    #include "save_array.h"
    #include <iostream>
    using namespace std;
    
    SAVE_ARRAY::SAVE_ARRAY(int anzahl)
    {
          anz = (anzahl-1);
    	Element = new double[anz];
    
    	for (int i=0; i<=anz; i++)
    	{
    		Element[i] = 0;
    	}
    }
    
    SAVE_ARRAY::~SAVE_ARRAY()
    {	
    	delete [] Element;
    }
    

    *** Main.cpp ***

    #include "save_array.h"
    #include <iostream>
    
    using namespace std;
    
    int main()
    {	
    	int indexe;
    
    	while(1)
    	{	
    		cin.sync();
    		cin.clear();			
    		cout << "Anzahl Array Indexe: ";
    		cin >> indexe;
    		if (cin)
    			break;
    	}
    
    	SAVE_ARRAY objekt(indexe);
    
    	return 1;
    }
    

    Ich hab absolut keinen Plan wo der Fehler sein soll. Vielleicht hat ja jemand von euch einen Hinweis.

    mfg
    Florian



  • ist indexe vielleicht 0?



  • Element = new double[anz];
    
        for (int i=0; i<=anz; i++)
    

    sollte

    Element = new double[anz];
    
        for (int i=0; i<anz; i++)
    

    sein
    Kurt

    btw: wozu soll

    anz = (anzahl-1);

    gut sein ?



  • thx! ich hab es jetzt so gemacht:

    SAVE_ARRAY::SAVE_ARRAY(int anzahl)
    {
    	anz = (anzahl-1);
    	Element = new double[anzahl];
    
    	for (int i=0; i<=anz; i++)
    	{
    		Element[i] = 0;
    	}
    }
    

    peinlich peinlich 🙄

    mfg
    Florian



  • muetze83 schrieb:

    *** Klasse.cpp ***

    [cpp]
    anz = (anzahl-1);
    Element = new double[anz];

    for (int i=0; i<=anz; i++)
    {
    Element[i] = 0;
    }
    }

    ich verstehe den sinn von anz = anzahl - 1 nicht ganz
    wenn du zb für 10 doubles Platz machen willst dann solltest du auch für 10 doubles platz reservieren.

    in der forschleife arbeitest du dann zwar 10 einträge ab (0-9) aber du greiftst im letzten Durchlauf auf einen Speicherbereich zu der dir nicht mehr gehört

    lg



  • //edit das war mist
    //edit2
    nunja der "Sinn" von anz ist , jener den das korrigierte Programm zeigt..
    mit anzahl wird reserviert und mit anz werden die Schleifendurchläufe bestimmt.



  • also ich würde generell in der schleife lieber "i < anz", anstatt "i <= anz" schreiben und halt "anz = anzahl" und nicht "anz = anzahl - 1".

    Ich mein vom Sinn her soll ja "anz" die Anzahl der Element enthalten, und das sind nun mal "Anzahl" Elemente und nicht "anzahl - 1".



  • Es wäre es sinvoller, wenn du deine Anzahl nicht nullbasiert speicherst, dass du also wenn dein Array 10 Elemente enthält, den Inhalt der Variablen auch bei 10 belässt. In deiner for-Schleife durchläufst du es dann so:

    for (int i=0; i<anz; i++)
    

    Dadurch brauchst du dann nicht 1 abziehen und hättest die 0-Anzahl reserviert für ein Array, in dem sich noch keine Elemente befinden, sofern du ein dynamisches Array gestalten und damit diesen leeren Zustand zulassen willst. Somit ist es auch leichter, die typischen "off by one"-Fehler zu vermeiden. Ein "Ich will ein Array mit 10 Elementen haben" entspricht ja auch mehr der logischen Vorstellung als ein "Ich möchte ein Array haben, dessen letztes Element den Index 9 hat" 😉

    Übrigens, falls du mit SAVE_ARRAY ein "sicheres" Array meinst und keins, das irgendetwas "speichert", dann solltest du es SAFE_ARRAY nennen. 🙂


Anmelden zum Antworten