Это проблема распределения памяти, которую я никогда не понимал.
void unleashMonkeyFish() { MonkeyFish * monkey_fish = new MonkeyFish(); std::string localname = "Wanda"; monkey_fish->setName(localname); monkey_fish->go(); }
В приведенном выше коде я создал объект MonkeyFish в куче, присвоил ему имя, а затем распространил его по всему миру. Предположим, что право собственности на выделенную память было передано самому объекту MonkeyFish - и только сам MonkeyFish будет решать, когда умереть и удалить себя.
Теперь, когда я определяю член данных «name» внутри класса MonkeyFish, я могу выбрать одно из следующего:
std::string name; std::string & name;
Когда я определяю прототип функции setName () внутри класса MonkeyFish, я могу выбрать один из следующих вариантов:
void setName( const std::string & parameter_name ); void setName( const std::string parameter_name );
Я хочу иметь возможность минимизировать количество копий строк. Фактически, я хочу полностью их устранить, если смогу. Итак, похоже, я должен передать параметр по ссылке ... не так ли?
Что меня беспокоит, так это то, что кажется, что моя переменная localname выходит за пределы области видимости после завершения функции unleashMonkeyFish (). Означает ли это, что я ПРИНУЖДЕН передать параметр копией? Или можно передать по ссылке и как-нибудь "сойти с рук"?
По сути, я хочу избежать этих сценариев:
- Я не хочу устанавливать имя MonkeyFish, только чтобы память для строки localname исчезла, когда функция unleashMonkeyFish () завершится. (Похоже, это было бы очень плохо.)
- Я не хочу копировать строку, если могу.
- Я бы предпочел не использовать новое местное имя
Какую комбинацию прототипа и элемента данных мне следует использовать?
УТОЧНЕНИЕ: в нескольких ответах предлагалось использовать ключевое слово static, чтобы гарантировать, что память не будет автоматически освобождена при завершении unleashMonkeyFish (). Поскольку конечная цель этого приложения - высвободить N MonkeyFish (каждая из которых должна иметь уникальные имена), это не жизнеспособный вариант. (И да, MonkeyFish, будучи непостоянными существами, часто меняют свои имена, иногда по несколько раз за один день.)
ИЗМЕНИТЬ: Грег Хьюджил указал, что хранить переменную имени в качестве ссылки незаконно, поскольку она не устанавливается в конструкторе. Я оставляю ошибку в вопросе как есть, так как думаю, что моя ошибка (и исправление Грега) может быть полезна тем, кто впервые видит эту проблему.