Связанный список удаляется только при отладке, но не при сборке - PullRequest
0 голосов
/ 08 апреля 2020

Вот простая реализация односвязного списка с функциями create(), addnode() и destroy(). После того, как я вызвал функцию уничтожения, я напечатал head->val, что должно вызвать ошибку сегментации, так как память освобождается. Однако это происходит только в режиме отладки. Если я собираю и запускаю, у программы не возникает проблем с печатью головы и даже всего списка.

Есть идеи, почему отладка и сборка дают разные результаты? Спасибо!

#include <iostream>
#include <cstdlib>
using namespace std;

typedef struct sllist{
    int val;
    struct sllist* next;
}
sllnode;

sllnode* create(int value)
{
    sllnode* p =(sllnode*) malloc(sizeof(sllnode));
    if(p == NULL)
        return NULL;
    p->val=value;
    p->next=NULL;
    return p;
}

sllnode* addnode(sllnode* head, int value)
{
    sllnode* p =(sllnode*) malloc(sizeof(sllnode));
    if(p == NULL)
        return NULL;
    p->val=value;
    p->next=head;
    return p;
}

void destroy(sllnode* head){
    if(head == NULL)
        return;
    destroy(head->next);
    free(head);
}

int main()
{
    sllnode* head = create(6);
    for(int i=1;i<=5;++i)
    {
        head=addnode(head,i+1);
    }
    sllnode* p = head;
    while(p != NULL)
    {
        cout<<p->val;
        p=p->next;
    }
    cout<<"\n"<<head<<"\n";
    destroy(head);
    cout<<head->val;
    return 0;
}

1 Ответ

2 голосов
/ 09 апреля 2020

После того, как я вызвал функцию уничтожения, я напечатал head-> val, который должен дать ошибку сегментации, когда память освобождена.

Вы ошибаетесь: доступ к освобожденной памяти почти никогда приводит к ошибке сегментации.

почему отладка и сборка дают разные результаты?

Распределители отладки часто перезаписывают освобожденную память легко распознаваемым шаблоном например 0xCDCDCDCDCD... или 0xDEADBEEF.... Чтение такой памяти все еще не приводит к ошибке сегментации, но разыменование указателя , находящееся в освобожденной памяти, делает (это цель перезаписи освобожденной памяти).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...