Hi all,
I've got an application that SIGSEGV a lot, and it always does so when I'm doing += with a string object. Now I've run "top" while my programming is running, and I don't see "free mem" run to zero, however the SIGSEGV is due to a malloc_consolidate leading back to my string's += method.
There could certainly be a massive memory leak somewhere else in my program, but since it always shows up with += I've been trying to see if it's my string class that's causing the problem. Also, wouldn't "top" show "free mem" of 0 if it was a problem with memory?

The malloc_consolidate always points to the "new" line below.

Can anyone see any error in this code? It's all inline -- that shouldn't make a difference should it??
Code:
class JString
{
   public:
.....................
      ~JString()
      {
         delete[] myCstring;
         myCstring = 0;
         myLength = 0;
      }; //end destructor
..............
      //returns number of chars
      int length() const
      {
         return strlen(myCstring);
      };  // end length()

      ///////////////////////////////////////////////////////
      // OPERATOR OVERLOADING
      ///////////////////////////////////////////////////////
      // postcondition: concatenates x onto object
      // assertion: fails if memory can't be allocated
      JString& operator +=(const JString & x)
      {
         int lastLocation = length();           // location of '\0'
         int newLength = lastLocation + x.length(); // object + added JString

         char * copyStr = x.myCstring;          // copy this one
         char * delStr  = myCstring;            // delete this one
         bool doDelete = false;                 // delete old JString?

         // check to see if local buffer not big enough
         if (newLength >= myLength)
         {
            char * newBuffer;
            newBuffer = new char[newLength + 1];  //<<<<<<<<<<-------- SIGSEGV here
            strcpy(newBuffer, myCstring); // copy into new buffer
            doDelete = true;
            myLength = newLength + 1;            // update information
            myCstring = newBuffer;
         } //end if

         // now catenate x to end of myCstring
         strcpy(myCstring + lastLocation, copyStr);

         if (doDelete)           // delete here for aliasing
         {
	    delete [] delStr;    // old JString
         } //end if

         return *this;

      }; //end +=
......................


      //maximum length of JString read from input
      enum { maxLength = 1024 };



  private:

    char *   myCstring;  // private C-style JString
    int      myLength;   // length of ourselves


}; //end class JString