помогите плз разобраться, почему работает мой кусок кода (является ли он корректным на самом деле и почему, или мне повезло)
работаю по гайду: http://cglab.ca/~abeinges/blah/too-many-lists/book/first-drop.html
мотивировка необходимости реализации drop в том, что при дефолтной реализации возможно переполнение стека при большом объеме списка. для проверки я написал тест:
#[test]
fn stack_overflow_on_drop() {
let mut list = List::new();
for n in 1..1000000 {
list.push(n);
}
}
тест успешно сыплется при дефолтной реализации drop (читай: при отсутствии реализации) и успешно проходит при реализации drop, приведенной в гайде. для сравнения, приведу эту реализацию здесь:
impl Drop for List { // List - это голова списка, а не его элемент
fn drop(&mut self) {
let mut cur_link = mem::replace(&mut self.head, Link::Empty); // зачищаем указатель на head
while let Link::More(mut boxed) = cur_link {
cur_link = mem::replace(&mut boxed.next, Link::Empty); // зачищаем указатель на каждый next
}
}
}
теперь моя реализация:
impl Drop for List { // List - это голова списка, а не его элемент
fn drop(&mut self) {
let mut cur_link = mem::replace(&mut self.head, Link::Empty); // зачищаем указатель на head
while let Link::More(boxed) = cur_link {
cur_link = boxed.next; // проходим по списку, но ничего не зачищаем
}
}
}
вопрос: почему эта реализация не переполняет стек при освобождении списка (проходит тест)? является ли она корректной, или это случайность?
heap, rust, структуры данных