Насколько я помню, это зависит от реализации вашего компилятора. Некоторые могут использовать оптимизацию копирования при записи и, следовательно, не создавать копию до тех пор, пока вы не измените значение.
Однако большинство реализаций просто скопирует строку.
Но все реализации позаботятся об очистке - поэтому вам не нужно вручную освобождать строковую память (вот что такое строковые объекты).
Конечно, вы должны освободить ваши строковые объекты, если они созданы в куче (или использовать смарт-указатель);)
Назначение и оператор = могут быть реализованы в терминах друг друга, поскольку они делают одно и то же - в зависимости от того, какая версия назначения вызывается (для всех перегрузок см. cpp reference ).