PDA

Visualizza la versione completa : [c++]problemi con delete


9178angel
30-08-2004, 23:28
puntualmente ogni volta che uso il comando delete il compilatore mi da un messaggio di access violation ad un indirizzo strano...
tolgo il comando delete e tutto funziona???? :dh: :master: :dh: :master:
adesso se uso due o tre volte il mio bel programma diventa na skifezza...ora nn capisco se sn io che nn so usare sto comando oppure
ci potrebbe essere qlke problema cn il mio sistema operativo oppure un problema di memoria ...nn riesco a capire...



compiltaore: dev c++ 4
sistema operativo:windows 98;
ram:64mb;
processore: pentium II 350 Mhz


lo so sn la vergogna di tutti gli informatici
cn un catorcio cos nn vado lontano
per se kiedo un altro pc a mio padre
sar lui a spedirmi lontano
detto ci chi si accontenta gode (cos e cos)
vabb adesso vado fuori tema...
please un aiutino

anx721
31-08-2004, 00:15
Sicuramente sbagli a gestire la memoria...probabilmente chiami delete su riferimenti gia deallocati...prova a postare un framento di codice, possibilmente indipendente da altro codice, che ti da il problema, che ci diamo uno sguardo...

PS: io fino a un anno fa stavo con un pentium 200 :rollo:

:ciauz:

9178angel
31-08-2004, 07:24
/* dichiarazione delle funzione membro merge */
void lista::merge(lista *pLista1, lista *pLista2)
{
lista *unione;

unione=new lista;
if ((pLista1)&&(pLista2))
{
if (pLista1->valore<pLista2->valore)
unione->succ=pLista1;
else
unione->succ=pLista2;
}
else if (!pLista1)
while (pLista2)
unione->succ=pLista2;
else
while (pLista1)
unione->succ=pLista1;
while ((pLista1)&&(pLista2))
{
delete pLista1;
delete pLista2;
}
if (pLista1)
delete pLista1;
else
delete pLista2;
};



naturalmente vanno inseriti gli elementi...
il programma parte ma nel momento in cui scelgo attraverso uno switch questa funzione mi da l'errore e questa l'unica in cui uso il delete...ho provato anche su altri programmi:tolto il delete tutto funziona a meraviglia!!!

anx721
31-08-2004, 11:48
Originariamente inviato da anx721
prova a postare un framento di codice, possibilmente indipendente da altro codice

:nonlodire


Comuqnue quella funzione non ha solo il problema del delete...

Innanzitutto dichiari una funzione void che non ritorna nulla, ti calcoli il merge (almenno queste sono le tue intenzioni...) in una lista unione di cui poi non te ne fai nulla... Se non ritorni niente il risultato deve essere memoriazzato o in una variabile globale o in uno degli argomenti... Io costruirei una nuova lista e la ritornerei come risultato; inoltre il metodo lo dichiarerei static se deve prendere 2 liste e restituire una nuova lista.


Poi sbagli ad appendere una lista:

while (pLista2)
unione->succ=pLista2;

qui non fai altro che continuare ad assegnare a unione -> succ pLista2..all'infinito...basta eseguire l'operazione una sola volta per concatenare pLista2 ad unione !


Inoltre unione non deve essere creato, perche gli elementi da inserire in unione gia esistono e sono quelli delle due liste iniziali.

Infine non devi chiamare il delete perche gli elementi delle liste non devono essere distrutti, devono semplicemente essere fusi insieme, concatenandoli opportunamente nella nuova lista...

:ciauz:

9178angel
31-08-2004, 13:53
si..hai ragione, l'ho fatto teri notte e mi sn sfuggite parecchie cose...cmq anche se l'ho modificato il problema persiste...ho tolto i delete e nn mi da + l'errore "access violation"...adesso addirittura mi da un errore di operazione nn valida solo perch faccio
cout << pLista1->valore;
:master:

anx721
31-08-2004, 14:57
se non posti il codice non ti si puo rispondere; e inserisci anche la definizione della classe o del tipo lista.

9178angel
31-08-2004, 18:49
class lista {
private :
lista *succ;
int valore;
public:
lista(void); // costruttore
~lista(void); // distruttore
void crea(lista *pLista, int numero);
void inserimento (lista *pLista);
void elimina(lista *pLista);
void stampa(lista *pLista);
void merge(lista *pLista1, lista *pLista2);
};
void lista::merge(lista *pLista1, lista *pLista2)
{

lista *unione,*temp1,*temp2;

temp1=pLista1;
temp2=pLista2;
while ((temp1)&&(temp2))
{

if ((temp2->valore)>(temp1->valore))
{
unione=temp1;

temp1=temp1->succ;


}
else
{

unione=temp2;
temp2=temp2->succ;
}
}
if (!temp1)
{
while (temp2)
{
unione=temp2;
temp2=temp2->succ;
}
}
else
{
while (temp1)
{
unione=temp1;
temp1=temp1->succ;
}
}
};

9178angel
31-08-2004, 19:16
mi sto esaurendo ogni vota che tento di accedere ad una variabile membro rincoglionisce il compilatore....scusate il termine ma nn normale stare trent'anni sullo stesso problema...

se tento di inserire all'interno del codice prima postato

cout << temp1->valore;

mi da errore

se provo a mettere a confronto temp1->valore<temp2->valore
mi da errore uffaaaaaa... :dh: :dh: :dh: :dh: :dh: :dh: :dh: :dh:

9178angel
31-08-2004, 19:18
taglio la testa al toro (poverino posto tutto il codice cos potete farlo partire...

il programma parte ma se accedo alla funzione merge impazzisce...boh???



#include <iostream.h>
#include <stdlib.h>

class lista {

lista *succ;
int valore;
public:
lista(void); // costruttore
~lista(void); // distruttore
void crea(lista *pLista, int numero);
void inserimento (lista *pLista);
void elimina(lista *pLista);
void stampa(lista *pLista);
void merge(lista *pLista1, lista *pLista2);
};
/*Dichiarazione funzione leggi*/
int Leggi(void)
{
int numero;
cout << "numero : " ;
cin >> numero;
return numero;
};

/* controlla se si tratta del primo elemento */
bool ListaVuota(lista *pLista)
{
return pLista==NULL;
};

/* Dichiarazione costruttore */
lista::lista(void)
{
succ=NULL;
};

/* Dichiarazione distruttore */

lista::~lista(void)
{
succ=NULL;
};

/* Dichiarazione della funzione membro crea */
void lista::crea(lista *pLista, int numero)
{
pLista=new lista;
while (numero=Leggi())
{
pLista->valore=numero;
pLista->succ=NULL;
}

};

/* Dichiarazione della funzone membro inserimento */
void lista::inserimento (lista *pLista)
{
int numero;
lista *nuovo, *temp,*prec;

crea(nuovo,numero);
if (&ListaVuota)
pLista=nuovo;
else
{
temp=pLista;
while ((temp != NULL)&&(nuovo->valore > temp->valore))
{
prec=temp;
temp=temp->succ;
}
nuovo->succ=temp;
prec->succ=nuovo;
}
};

/* Dichiarazione della funzione elimina */
void lista:: elimina(lista *pLista)
{
lista *temp, *prec;
int dato;
bool trovato;

cout << "Inserire il dato da cancellare: ";
cin >> dato;
if (&ListaVuota)
cout << "Errore: la lista vuota!!!" << endl << endl;
else
{
trovato=false;
prec=NULL;
temp=pLista;
if (pLista->valore=dato)
{
pLista=pLista->succ;
delete temp;
trovato=true;
}
else
while ((!trovato)&&(temp!=NULL))
{
if (temp->valore=dato)
{
trovato=true;
prec->succ=temp->succ;
delete temp;
}
else
{
prec=temp;
temp=temp->succ;
}
if (!trovato)
cout << "Il dato richiesto non esiste!" << endl << endl;
}
}
};

/* dichiarazione della funzione membro stampa */
void lista::stampa(lista *pLista)
{
lista *temp;
cout << " ---------- ELENCO COMPLETO ---------- " << endl << endl;
temp=pLista;
while (temp!=NULL)
{
cout << temp->valore;
temp=temp->succ;
}
cout << " ------------------------------------- " << endl << endl;
};

/* dichiarazione delle funzione membro merge */
void lista::merge(lista *pLista1, lista *pLista2)
{

lista *unione,*temp1,*temp2;

temp1=pLista1;
temp2=temp1->succ;
cout <<"a"<<endl;
while ((temp1)&&(temp2))
{

if ((&temp2->valore)>(&temp1->valore))
{
unione=temp1;
cout << "d" <<endl;
temp1=temp1->succ;
cout << "e"<<endl;

}
else
{
cout <<"c" <<endl;
unione=temp2;
temp2=temp2->succ;
}
}
if (!temp1)
{
while (temp2)
{
unione=temp2;
temp2=temp2->succ;
}
}
else
{
while (temp1)
{
unione=temp1;
temp1=temp1->succ;
}
}
};

int main()
{
lista *primo,*secondo,*unione;
bool finito=false;
int scelta;

cout << " Implementa gli elementi della prima lista " << endl
<< " 0 per terminare: " << endl << endl;
primo->inserimento(primo);
system("CLS");
cout <<" Implementa gli elementi della seconda lista " << endl
<< " 0 per terminare: " << endl << endl;
secondo->inserimento(secondo);
system ("CLS");
cout << "1- Inserimento" << endl
<< "2- Cancellazione" << endl
<< "3- Fusione" << endl
<< "4- Fine" << endl << endl
<< "Scelta: ";
cin >> scelta;

switch (scelta)
{
case 1:
/*merge*/
unione->merge(primo,secondo);
unione->inserimento(unione);
break;
case 2:
unione->merge(primo,secondo);
unione->elimina(unione);
break;
case 3:
unione->merge(primo,secondo);
unione->stampa(unione);
break;
case 4:
exit(8);
}

system("PAUSE");
return 0;
}

anx721
31-08-2004, 19:19
ma tali accessi li fai all'interno di una fuznione della classe? Questi menbri sono privati.

Loading