Вы не можете вернуть ссылку на локальную переменную из функции с c ++. Хотя в c ++ 0x это возможно.
Выделите строку в куче и очистите вручную позже:
Если вы не можете изменить интерфейс функции, вам нужно будет создать ее в куче, а затем вручную удалить ее.
//Remember to free the address that getVal returns
const std::string& getVal(const std::string &key) {
std::string *retVal = new std::string();
... //build retVal string with += operator based on key
return *retVal;
}
То же решение, но не вручную:
Поскольку вышеизложенное в конечном итоге приведет к утечке памяти, если вы забудете ее освободить вручную. Я бы порекомендовал обернуть этот вызов в класс и использовать RAII. То есть в конструкторе вызовите getVal и установите член этого класса так, чтобы он указывал на него. В деструкторе вашего класса вы бы удалили его.
Почему код, который вы дали с shared_ptr, не работает:
shared_ptr работает через подсчет ссылок. Поскольку вы уничтожаете единственный объект shared_ptr (по объему), ссылок не осталось, и память будет освобождена. Чтобы это сработало, вам нужно вернуть shared_ptr, но вы сказали, что не можете этого сделать.