Это проблема распределения памяти, которую я никогда не понимал.Когда это не очень хорошая идея?
void unleashMonkeyFish() { MonkeyFish * monkey_fish = new MonkeyFish(); std::string localname = "Wanda"; monkey_fish->setName(localname); monkey_fish->go(); }
В приведенном выше коде, я создал объект MonkeyFish в куче, присваивается ей имя, а затем развязал его на весь мир. Предположим, что собственность выделенной памяти была передана самому объекту MonkeyFish, и только сам MonkeyFish решит, когда умереть и удалить себя.
Теперь, когда я определяю элемент данных «имя» внутри класса MonkeyFish, я могу выбрать одно из следующих действий:
std::string name; std::string & name;
Когда я определить прототип функции SetName() внутри класса MonkeyFish , Я могу выбрать один из следующих вариантов:
void setName(const std::string & parameter_name); void setName(const std::string parameter_name);
Я хочу иметь возможность свести к минимуму строковые копии. На самом деле, я хочу полностью их уничтожить, если смогу. Итак, кажется, что я должен передать параметр по ссылке ... правильно?
Какие ошибки меня то, что моя локальная переменная будет выходить за рамки после завершения функции unleashMonkeyFish(). Означает ли это, что я FORCED передал параметр путем копирования? Или я могу передать его по ссылке и «сойти с рук» каким-то образом?
В принципе, я хочу, чтобы избежать этих сценариев:
- Я не хочу, чтобы установить имя MonkeyFish, только чтобы иметь память для строки LocalName уходят, когда функция unleashMonkeyFish() завершается. (Кажется, это было бы очень плохо.)
- Я не хочу копировать строку, если я могу ей помочь.
- Я предпочел бы не новый LocalName
Что прототип и данные члена комбинацию следует использовать?
CLARIFICATION: Несколько ответов, предложенных с использованием ключевого слова static, чтобы гарантировать, что память не будет автоматически удалена при завершении unleashMonkeyFish(). Поскольку конечная цель этого приложения состоит в том, чтобы развязать N MonkeyFish (все из которых должны иметь уникальные имена), это не является жизнеспособным вариантом. (И да, MonkeyFish - быть непостоянные существа - часто меняют свои имена, иногда несколько раз в течение одного дня.)
EDIT: Грег Hewgil отметил, что это незаконно, чтобы сохранить имя переменной в качестве ссылки, поскольку он не устанавливается в конструкторе. Я оставляю ошибку в вопросе как есть, так как я думаю, что моя ошибка (и исправление Грега) может оказаться полезной для тех, кто впервые видит эту проблему.
Профилированы ли вы и решили, что это проблема? – CTT
@ CTT - Нет, нет. Однако, кажется, неэффективно копировать строку, если я могу ее избежать. В общем, я хочу избежать копирования как можно больше. – Runcible
«monkey_fish» находится в куче, а не в стеке. –