Я согласен с другими постерами, что вы должны использовать строку.
Но знайте, что в зависимости от того, насколько агрессивно ваш компилятор оптимизирует временные значения, вы, вероятно, будете иметь некоторые дополнительные издержки (по сравнению с использованием динамического массива символов). (Примечание: хорошая новость заключается в том, что в C ++ 0a разумное использование ссылок на rvalue не потребует оптимизации компилятора, чтобы купить эффективность здесь - и программисты смогут дать некоторые дополнительные гарантии производительности своего кода, не полагаясь на качество компилятор.)
В вашей ситуации, стоит ли тратить лишние накладные расходы на ручное управление памятью? Наиболее разумные программисты с этим не согласятся - но если у вашего приложения возникают проблемы с производительностью, следующим шагом будет профилирование вашего приложения - таким образом, если вы вносите сложность, вы делаете это только тогда, когда у вас есть веские доказательства того, что это необходимо для улучшения общая эффективность.
Кто-то упомянул, что оптимизация возвращаемого значения (RVO) здесь не имеет значения - я не согласен.
Стандартный текст (C ++ 03) для этого читает (12.2):
[Начать стандартную цитату]
Временные шкалы типа класса создаются в различных контекстах: привязка значения r к ссылке (8.5.3), возвращение значения r (6.6.3), преобразование, создающее значение r (4.1, 5.2.9, 5.2.11). , 5.4), выбрасывая исключение (15.1), вводя обработчик (15.3) и в некоторых инициализациях (8.5). [Примечание: время жизни объектов исключений описано в 15.1. ] Даже если избегать создания временного объекта (12.8), все семантические
ограничения должны соблюдаться, как если бы временный объект был создан. [Пример: даже если конструктор копирования не вызывается, все семантические ограничения, такие как доступность (пункт 11), должны быть выполнены. ]
[Example:
struct X {
X(int);
X(const X&);
˜X();
};
X f(X);
void g()
{
X a(1);
X b = f(X(2));
a = f(a);
}
Здесь реализация может использовать временное средство для конструирования X (2) перед передачей его в f () с использованием конструктора копирования X; альтернативно, X (2) может быть построен в пространстве, используемом для хранения аргумента. Кроме того, временное значение может использоваться для хранения результата f (X (2)) перед его копированием в b с помощью конструктора копирования X; в качестве альтернативы результат f () может быть построен в b. С другой стороны, выражение a = f (a) требует временного для аргумента a или результата f (a), чтобы избежать нежелательного наложения псевдонима
а. ]
[конец стандартной цитаты]
По сути, текст выше говорит о том, что вы можете полагаться на RVO в ситуациях инициализации, но не в ситуациях назначения. Причина в том, что когда вы инициализируете объект, нет никакого способа, которым то, с чем вы его инициализируете, могло бы быть привязано к самому объекту (именно поэтому вы никогда не выполняете самопроверку в конструкторе копирования), но когда вы делаете назначение, это может.
В вашем коде нет ничего, что по сути запрещает RVO, но прочитайте документацию вашего компилятора, чтобы убедиться, что вы действительно можете положиться на него, если он действительно вам нужен.