2013-06-12 2 views
0

Код ниже показывает плохой пример управления памятью; элемент никогда не выделяется, потому что вместо него возвращается временная копия.Как избежать возврата временного объекта (C++)

В течение нескольких недель я просматривал форумы программирования, но не нашел четкого объяснения относительно правильного возврата действительного экземпляра типа Item *, позволяя исключить выделение элемента. Другими словами, что является лучшей альтернативой этому коду, который выполняет одно и то же возвращаемое значение и тем не менее позволяет выделить элемент?

Item* Inventory::add(const string& name) 
{ 
    Item* item = new Item(name); 
    ...(some other code here)... 
    return item; 
} 

Спасибо!

+0

Как насчет 'std :: unique_ptr '? –

+0

Я не понимаю, почему это проблема. Вы вернули единственную копию указателя на _item_ клиенту - теперь это задача клиента, чтобы освободить его. Просто сделайте этот факт явным в контракте/документации/комментариях. – DaoWen

ответ

0

Возможно, вы считаете, что все уничтожено после того, как оно выходит за пределы цикла, но возвращаемый указатель (и память, указывающая на). Он передается объекту, который вызывает этот метод, и утечка памяти не происходит.

+0

Спасибо. Позвольте мне добавить одно: я не владею частью кода клиента, поэтому я не могу освободить его оттуда. Есть ли другой способ избежать утечки памяти? – user2476826

+0

Это действительно зависит от объема и видимости вашей части вашего кода. В одном примере производственного кода, который я видел, есть несколько классов «менеджера», которые обрабатываются одним глобальным классом главного менеджера. Пользователь должен создать указатель на класс главного менеджера. Тогда, когда пользователю нужен один из классов «manager», они могут вызывать 'new', чтобы получить указатель как обычно, но они не должны освобождать эти указатели; им нужно только вызвать 'delete' указателя главного менеджера, и он, в свою очередь, освободит все существующие классы менеджера. – Neoh

Смежные вопросы