Ist das ne Speicherverletzung?
-
String::String (int iLength, const char* acText) { if ( iLength < 0 || (iLength > 0 && !acText) ) { assert( false ); iLength = 0; } #ifdef _DEBUG // make sure acText has as many non-null characters as specified if ( iLength > 0 ) { int i; for (i = 0; i < iLength; i++) { if ( acText[i] == 0 ) break; } assert( i == iLength ); } #endif m_iLength = iLength; if ( m_iLength > 0 ) { m_acText = new char[m_iLength+1]; strncpy(m_acText,acText,m_iLength); m_acText[m_iLength] = 0; } else { m_acText = new char[1]; m_acText[0] = 0; } } String String::operator+ (const String& rkString) { int iLength = m_iLength + rkString.m_iLength; char* acNew = new char[iLength+1]; strcpy(acNew,m_acText); strcat(acNew,rkString.m_acText); return String(iLength,acNew); }
Geht da Speicher verloren denn ich lösche ja niergends acNew?
-
Logischerweise ja, oder etwa nicht? Denk mal nach.
Ausserdem wenn du nach einem assert(false); iLength = 0; machst bringt dir das null, denn das wird nie ausgeführt
-
evilissimo schrieb:
Ausserdem wenn du nach einem assert(false); iLength = 0; machst bringt dir das null, denn das wird nie ausgeführt
Doch, wenn NDEBUG definiert ist.
-
Ach, sowas steht im Standard?
-
macht auf jeden fall von der logik her keinen sinn. Wenn man assert(0) schreibt will man das es nie ausgeführt wird, also schreibt man da auch keinen zusätzlichen Code rein.
-
evilissimo schrieb:
Ach, sowas steht im Standard?
Jup.