Microsoft KB Archive/172398

From BetaArchive Wiki

Article ID: 172398

Article Last Modified on 11/18/2003



APPLIES TO

  • The Standard C++ Library, when used with:
    • Microsoft Visual C++ 5.0 Enterprise Edition
    • Microsoft Visual C++ 5.0 Professional Edition



This article was previously published under Q172398

SYMPTOMS

When you assign a shorter string to an existing string that originally contained a longer string, the assignment corrupts the heap.

When running a debug build, you may see an assertion similar to the following:

Debug Error!
    Program <your program name>
    DAMAGE: after Normal block (#NNN) at 0xNNNNNNNN
                    

CAUSE

This problem is due to a bug in the Standard C++ Library basic_string class implementation. When assigning a shorter string to an existing string that originally contained a longer string, the heap is corrupted. The assignment can be done either through operator=() or assign().

RESOLUTION

To work around the problem, call the string::erase member function before assigning the new value to the existing string.

STATUS

Microsoft has confirmed this to be a bug in the Microsoft products listed at the beginning of this article. This problem was corrected in Visual C++ version 6.0 for Windows.

MORE INFORMATION

Steps to Reproduce Behavior

   //Compile options needed: /GX
   #include <crtdbg.h>
   #include <string>

   int main()
   {
       std::string  str, str2;
       str = "abcdefghijklmnopqrstuvwxyzabcdefghij" ;
       str2 = str;

       //Workaround, uncomment the following line
       //str.erase() ;

       str = "zyxw" ;
       _CrtCheckMemory() ;

       return 0;

   }
                

Keywords: kbbug kbfix kbvc600fix KB172398