Я пытался переписать его, чтобы он соответствовал адресам, но не повезло. Я думаю, что функция buildItem создает временный объект, который уничтожается при завершении функции.
Ваша интуиция наполовину верна. С этой функцией что-то не так, но она не имеет ничего общего с временными. Это больше о том, что вы выделяете объект, который вы никогда не уничтожаете.
Проблема в том, что вы пытаетесь сделать нечто подобное , что я пытался сделать в этом вопросе , но не совсем. Даже если бы вы делали то, что я делал, это все равно не было бы хорошей идеей по причинам, которые многие люди уже объяснили лучше, чем я.
Дело в том, что суть проблемы заключается в том, чтоесли вы используете new
для выделения чего-либо, вы должны использовать delete
для его освобождения, чего вы здесь не делаете.
InventoryObject buildItem() {
InventoryObject *tempObject = new InventoryObject;
//...
return *tempObject;
}
Вы просто возвращаете объектзначение, не удаляя его в первую очередь. Вы даже не возвращаете его по ссылке, что было бы лучше (но все же, вероятно, плохо: снова, см. мой вопрос ). Вы выделяете объект и никогда не удаляете его. Это утечка.
У вас есть два решения: либо вернуть указатель напрямую (если вам действительно нужен указатель), например так:
InventoryObject* buildItem() {
InventoryObject *tempObject = new InventoryObject;
//...
return tempObject;
}
Или вы можете просто вернуть объект:значение как это:
InventoryObject buildItem() {
InventoryObject tempObject;
//...
return tempObject;
}
Учитывая пример кода, который вы показали, это моя рекомендация из двух.
Примечание: я должен упомянуть, что если по какой-то причине выВам нужно вернуть указатель и иметь в игре какой-то шаблон фабричного метода с полиморфизмом, у вас также есть опция smart pointers . Именно это я и сделал, основываясь на предложениях других людей из другой ветки. Я могу лично рекомендовать это. По сути, ваш код стал бы примерно таким:
std::unique_ptr<InventoryObject> buildItem() {
std::unique_ptr<InventoryObject> tempObject = new InventoryObject; // C++11 way, I think
// C++14 and above has a function called make_unique you could use instead.
//...
return tempObject;
}
Однако, это полезно, только если у вас происходит какой-то полиморфизм, как я. Учитывая пример кода, который вы опубликовали до сих пор, вам действительно нужно возвращать только по значению в вашей ситуации. Я просто подумал, что упомяну и этот другой вариант, на всякий случай.
P. (P.) S. Этот ответ касается только вашей предполагаемой утечки памяти. Тем не менее, здесь есть и другие полезные ответы, на которые вам следует обратить внимание. Проблемы, описанные в других ответах, могут усугубить вашу проблему и могут действительно сбить вас с толку (на самом деле, могут все же сбить вас с толку и сейчас), если вы их не исправите, поэтому я настоятельно рекомендую воспользоваться их советом.