Проблема с овобождением памяти в C++?

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by ZipaCna, 18 Mar 2009.

  1. ZipaCna

    ZipaCna Elder - Старейшина

    Joined:
    29 Feb 2008
    Messages:
    60
    Likes Received:
    15
    Reputations:
    3
    Вообще не могу понять в чем проблема. Удаляет столько же элементов сколько и выделялось по тем же адресам. При небольшом числе элементов всё ок а когда много, то ошибка.
    Плизз хелп



    Code:
    struct my_list{
    int o;
    my_list *prev;
    my_list *next;
    };
    
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    vector<my_list*> test; //для дебага
    
    my_list first;
    first.prev=NULL;
    first.next=NULL;
    my_list *curr;
    curr=&first;
    
    /////////////////////////////////
    //вставляет элементы в конец списка
    for (int i=0;i<100000;i++){
      my_list *temp;
      temp=new my_list;
      //temp->prev=NULL;
      temp->next=NULL;
      //cout<<temp<<endl;
      test.push_back(temp); //для дебага
      curr->next=temp;
      temp->prev=curr;
      curr=temp;
    }
    ///////////////////////////
    
    /////////////////////////
    //освобождает список
    //можно было освобождать с хвоста списка но мне нужно так.
    int ii=0; //для дебага
    my_list *temp,*a;
    a=&first;
    while(a->next){
    	a=a->next;
    	temp=a->prev;
    	temp->next=a->next;
    	//cout<<a<<endl;
    	if(a!=test[ii])cout<<"error"; //для дебага
    	ii++; //для дебага
    	delete a; 
    	a=temp;
    }
    /////////////////////////////////////////////////
       return 0;
    }
    
    
     
  2. _nic

    _nic Elder - Старейшина

    Joined:
    5 May 2006
    Messages:
    651
    Likes Received:
    54
    Reputations:
    3
    Какая ошибка?
     
  3. awdrg

    awdrg Member

    Joined:
    30 Jan 2009
    Messages:
    195
    Likes Received:
    31
    Reputations:
    1
    если мне не изменяет память, то по нормам синтакиса нужно писать
    Code:
    delete [ ] a;
    
     
  4. ZipaCna

    ZipaCna Elder - Старейшина

    Joined:
    29 Feb 2008
    Messages:
    60
    Likes Received:
    15
    Reputations:
    3
    Нашел ошибку, при удалении забыл список назат связать.
    while(a->next){
    temp=a;
    a=a->next;
    if(a->next){
    temp->next=a->next;
    a->next->prev=temp;
    }else{
    temp->next=0;
    }
    delete a;
    a=temp;
    }