Speicherplatz freigeben
-
Hallo habe ein kleines Problem mit der Speicherplatzfreigabe
Zunächst erzeuge ich ein Zeigerfeld in zwei Dimensionen
if (posix_memalign((void *) &m->rowcol, align, size_dp * m->nrow))
return (MTH_NOMEM); / space for row pointers */
else {
for(i = 0; i < m->nrow; i++)
if (posix_memalign((void **) (&m->rowcol[i]), align, size_dp * m->ncol))
return(MTH_NOMEM);
}Alles klappt damit auch wunderbar aber jetzt möchte ich den Speicher wieder freigeben mit
for(i = m->nrow-1; i>=0; i--)
free(&(m->rowcol[i]));
free((charm->rowcol);
Aber in der For-Schleife erhalte ich Speicherzugriffsfehler
Wo ist mein Denkfehler??Hier ist noch der Typ:
typedef struct { /* double matrix */
double ***rowcol; /* for array of row and column pointers */
} dcubmatrix;Danke
-
Hallo, benutz bitte C/C++ Tags, sonst hat keiner das Lust zu lesen.
Mit den Tags sieht das dann so aus:if (posix_memalign((void **) &m->rowcol, align, size_dp * m->nrow)) return (MTH_NOMEM); /* space for row pointers */ else { for(i = 0; i < m->nrow; i++) if (posix_memalign((void **) (&m->rowcol[i]), align, size_dp * m->ncol)) return(MTH_NOMEM); }
Alles klappt damit auch wunderbar aber jetzt möchte ich den Speicher wieder freigeben mit
for(i = m->nrow-1; i>=0; i--) free(&(m->rowcol[i])); free((char *) m->rowcol);
Aber in der For-Schleife erhalte ich Speicherzugriffsfehler
Wo ist mein Denkfehler??Hier ist noch der Typ:
typedef struct { /* double matrix */ double ***rowcol; /* for array of row and column pointers */ } dcubmatrix;
Danke
*****************************************************************************
Soweit so gut.
Um den Speicherplatz freigeben zu können, muss man wissen wie dieser reserviert wurde.
Ich kenne drei Arten der Reservierung und Adressierung eines 2D Arrays, wobei sich drei verschiedene Freigabemethoden ergeben.
Um ein Raten zu vermeiden, könntest du den Quellcode für die Reservierung posten ?Gruß D.n.n.N.
-
Ok bin neu und man lernt nie aus.
Ist eben eine 3 dim Matrix.
Ich dachte, ich habe nun ein zweidimensionales zeigerarray und zeige immer auf [Reihe][Spalte] der letzte Index geht dann an die entsprechende Stelle des dritten Indices//Prozedur if (posix_memalign((void **) &m->data, align, size_d * m->n) || posix_memalign((void **) &m->rowcol, align, size_dp * m->nrow)) return (MTH_NOMEM); /* space for data & row pointers */ else { for(i = 0; i < m->nrow; i++) if (posix_memalign((void **) (&m->rowcol[i]), align, size_dp * m->ncol)) return(MTH_NOMEM); } for(i=0; i < m->n ; i++) m->data[i]=i; // nur zum Test, damit es mit werten belegt ist (m->rowcol[0][0]) = &(m->data[0])-ndl; // ndl ist der kleinste Index des dritten Indices for(k = 0; k < m->nrow; k++){ for(j = 0; j < m->ncol; j++){ if ((k != 0) ||(j != 0)) { m->rowcol[k][j]=m->rowcol[0][0] +(k * (m->ncol * m->nde)+ j * m->nde); } } } for(i=0; i < m->nrow ; i++) m->rowcol[i]=&m->rowcol[i][0]-ncl; // ncl ist der kleinste Index des zweiten Indices m->a = m->rowcol - nrl ; //nrl ist der kleinste Index des ersten Indices // Zugriff erfolgt später über m->a[erste][zweite][dritte]=25; //Prozedur Ende typedef struct { /* double matrix */ double ***a; double ***rowcol; /* for array of row and column pointers */ double *data; /* data space for elements */ */ } dcubmatrix;
-
Danke ich hab den Fehler selbst gefunden.
Aber ich verstehe eigentlich eins nicht.
Wenn ich das &davor schreibe, dann beziehe ich mich doch immer auf eine Adresse.
Und ein Zeiger hat doch immer eine Adresse und auch einen Speicherbereich, der auch eine Adresse ( dort wo er hinzeigt ) ist.
for(i = 0; i < m->nrow; i++) if (posix_memalign((void **) (&m->rowcol[i]), align, size_dp * m->ncol));
hier habe ich ja alloziert
for(i=0; i < m->nrow ; i++) m->rowcol[i]=&m->rowcol[i][0]-ncl;
hier ändere ich doch nur die Adresse im Speicherbereich von m->rowcol[i] aber doch nicht die Adresse wo es sich befindet.
for(i = m->nrow-1; i>=0; i--) { free((m->rowcol[i])+m->ncl); }
warum muss ich das dann hier wieder abziehen?
benötigt free nicht die Adresse, wo es im Speicher steht?
-
Das liegt daran, das posix_memalign einen Zeiger auf das was du reservieren willst, daher kommt im Funktionsaufruf der zusätzliche Adressoperator.
Ich blicke bei deinen ganzen ndl, nde, nrl, ncl uns so nicht durch.
Naja, ist ja auch nicht nötig, hast es ja jetzt selbst geschafft.Man könnte eine 3D Matrix auch als einen Speicherblock organisieren, du hättest damit nur einen Zeiger auf double, bzw. einen Zeiger auf double in deiner Struktur. Allerdings könnte man die Matrix nicht mehr mit dem Indexoperator ansprechen. rowcol[i][j][k], sondern über Zeiger: ( rowcol + i*b*c + jc + k )
-
Edit:
Oje, da ist mir beim Zeilenändern was weggelöscht, also den einen Satz noch einmal:Das liegt daran das posix_memalign einen Zeiger, auf das was du reservieren willst, benötigt.
So, aber jetzt