anscheinend Gültigkeitsprobleme
-
Hi,
ich habe da ein Problem das mich ziemlich laust:
Ich implementiere eine Klasse und allokiere dann innerhalb einer Methode Speicher, den Zeiger darauf gebe ich einer Klassenvariable. Diesen Speicher kann ich auch noch problemlos in einer anderen Methode freigeben, versuche ich das aber im Destruktor wird beim Debuggen ein benutzerdefinierter Haltepunkt in der delete Funktion aufgerufen, beim normalen Ausführen kommt es zum Programmabsturz. Ich denke mir mal, dass der Speicher seine Gültigkeit außerhalb einer Methode verliert, aber eigentlich kann das auch nicht so richtig sein. Vielleicht weiß ja jemand eine Lösung, ansonsten poste ich gerne auch noch Beispielcode.
MfG dielösung
-
Hallo,
Sofern du die Adresse auf den Beginn des dynamisch allokierten Speichers korrekt sicherst, geht dieser nicht beim Verlassen der Methode verloren...Beispiel: Hier ist der Speicher unabhängig von den Methoden verfügbar.
class foo { int *p; public: foo() : p(0) {} ~foo() { delete[] p; } void alloc(size_t n) { if(n && !p) p = new int[n]; } void free() { delete[] p; p = 0; } };dielösung schrieb:
ansonsten poste ich gerne auch noch Beispielcode.
Das wäre das beste :).
/edit: mal sehen, wann dieser edit erscheint... *mit dem Server kämpf*
Gruß Caipi
-
der Fehler scheint in einer Art "entwertung" des Codes zu liegen, denn ich habe einfach nur nochmal das Prinzip von deinem Beispiel nachgebaut, da lief alles. Ich bin mir sicher, dass der Fehler in diesem Stück Code liegt:
/* Variablen */ int offset = 0; int padWidth = 0; int byteWidth = 0; int lWidth = m_bmih.biWidth; int lHeight = m_bmih.biHeight; BYTE* pTmpBits = NULL; byteWidth = padWidth = (int)((float)m_bmih.biWidth * (float)m_bmih.biBitCount/8.0f); /* Feststellen von Padding */ while (padWidth%4 != 0) padWidth++; /* Zur Verfügungstellen einer zweiten Speichereinheit */ pTmpBits = m_pBits; m_pBits = new BYTE[abs( lHeight ) * byteWidth]; /* Formatieren */ if (lHeight < 0) // normale Zeilenfolge { lWidth *= -1; offset = 0; while (offset < lWidth) { memcpy( (m_pBits + (offset * byteWidth)), (pTmpBits + (offset * padWidth)), byteWidth ); offset++; } // while } // if else // umgekehrte Zeilenfolge { if (m_bmih.biBitCount == 24) // 24-Bit-Bitmap // Diesen Steuerelementpfad teste ich grade { int j = m_size - 3; offset = padWidth - byteWidth; for (int i = 0; i < m_size; i+=3) { if ((i + 1)%padWidth == 0) i += offset; *(m_pBits+j+2) = *(pTmpBits+i); *(m_pBits+j+1) = *(pTmpBits+i+1); *(m_pBits+j) = *(pTmpBits+i+2); j-=3; } // for } // if else // 32-Bit-Bitmap { int j = m_size - 4; for (int i = 0; i < m_size; i+=4) { *(m_pBits+j+3) = *(pTmpBits+i); *(m_pBits+j+2) = *(pTmpBits+i+1); *(m_pBits+j+1) = *(pTmpBits+i+2); *(m_pBits+j) = *(pTmpBits+i+3); j-=4; } // for } // else } // else /* Speicherfreigabe */ delete [] pTmpBits; return true;und zwar bei der Übergabe des Speichers in dem markierten Steuerelementpfad. Ich habe übrigens die Eingangswerte alle im Debugger überprüft und sicher gegangen, dass die Methode mit den richtigen Werten arbeitet.
-
dielösung schrieb:
if ((i + 1)%padWidth == 0) i += offset;das scheint mir nicht richtig zu sein - das bricht nicht rechtzeitig ab, wenn ein padding von 2 oder 3 byte vorliegt. konsequenterweise überschreibst du dann den kontrollblock deines heapblocks teilweise. sonderlich elegant ist die schleife auch nicht - im grunde solltest du nur eine variable benötigen.
/* Feststellen von Padding */ while (padWidth%4 != 0) padWidth++;das ist jetzt schon das 3. mal dass ich so ein ding sehe - ein bisschen mathematik hilft hier weiter und führt zu:
padWidth = ( padWidth + 3 ) & ~3;
-
thx,
naja ich hab den code größtenteils aus dem netz, ich schätze mal, dass du deshalb sowas schon öfter gesehen hast. Hat sich wahrscheinlich gut verbreitet.
-
Ach, kannst du mal den Rechenweg posten, mit dem du auf diese Vereinfachung gekommen bist? Ich seh bei sowas nämlich überhaupt nicht durch und kann mir auch nicht vorstellen wie man eine Gleichung mit Restdivision drin bearbeitet.