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.


Anmelden zum Antworten