unsigned char String::changeBuffer(unsigned int maxStrLen)
{  
    size_t newSize = (maxStrLen + 16) & (~0xf);  
    char *newbuffer = (char *) malloc(newSize); 
    if(newbuffer) {
        memset(newbuffer, 0, newSize); 
        memcpy(newbuffer, buffer, len);  
        if (buffer) { 
            free(buffer);  
        } 
        capacity = newSize - 1;  
        buffer = newbuffer;
        return 1; 
    } 
    buffer = newbuffer;
    return 0;
}
I think on allocation failure nothing should happen and 0 should be returned.