Я не понимаю, когда мне следует освобождать следующий объект из памяти:
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(nullptr) {}
};
ListNode* addTwoNums(ListNode* l1, ListNode* l2){
ListNode *head = new ListNode(0);
...
return head->next;
}
Поскольку я возвращаю главный объект, когда мне его удалить, чтобы не было утечки памяти?
Каждая функция, принимающая или возвращающая указатель, должна иметь соглашение о том, кто несет ответственность за владение ресурсом, на который указывает указатель. Когда вы используете необработанные указатели, такие как вы, этот контракт является неявным, а это означает, что вам нужно выяснить, кто освобождает объект (кажется очевидным, что вызывающая сторона должна это сделать).
Если вы почитаете std::unique_ptr
и std::shared_ptr
, вы найдете несколько очень хороших и полезных альтернативных способов выражения этого контракта, которые помогут вам обойти вопрос о том, кому принадлежит объект, и положиться на стандартную библиотеку, чтобы определить это.
Я бы не стал рекомендовать std:::shared_ptr
для возврата с функции. Если вы вернете std::unique_ptr
, вызывающий абонент может преобразовать его в std::shared_ptr
, если ему это нужно (что менее вероятно).
@Galik: std::shared_ptr
позволяет скрыть Deleter
, что может быть лучше, например, для виртуальных функций (затем мы можем предоставить средство удаления noop или использовать псевдонимы std::shared_ptr
). Кроме того, некоторые могут поспорить и с «оптимизацией» std::make_shared
.
Меня смущает то, что этот код должен делать. Зачем возвращать указатель ListNode? Почему
head->next
?