Yes, String does not do a good job of recovering memory. If in loop(0, the free memory reduces each cycle until it crashes. However, the File library, included in SD, is OK to create an instance for each write, so that each record can open and close. My problem is with SD's SRAM usage, needing 400 bytes free before making a record. In my latest project (see My first Ardurino project) I had to use PROGMEM to cut my SRAM footprint. Since I had to write a custom LCD class anyway,(because I used a shift register) I put the excess code to display a string from the program memory in a method.
The core Arduino software has a serious bug in dynamic memory allocation so any library that uses dynamic memory may crash even if very little memory is used.
The bug involves how the free list is maintained. So SD or String can suddenly crash with very little memory in use.