Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Insta360 Luna Ultra: la potenza del sensore da 1 pollice incontra la portabilità estrema
Insta360 Luna Ultra: la potenza del sensore da 1 pollice incontra la portabilità estrema
Insta360 Luna Ultra integra un sensore da 1 pollice 8K, ottiche Leica e triplo chip IA. Tra schermo OLED rimovibile, workflow I-Log a 10 bit e stabilizzazione a tre assi, analizziamo le doti tecniche di una gimbal camera pensata per i professionisti
Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa
Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa
Marvel's Wolverine porta Logan in un'avventura inedita, violenta e fortemente narrativa, costruita attorno alla sua natura di combattente e al difficile rapporto con il proprio passato. Insomniac Games punta su combattimenti spettacolari, progressione e personalizzazione, inserendo l'azione in un mondo segnato dalla persecuzione dei mutanti. Un viaggio intenso, che alterna mattanza, esplorazione e momenti sorprendentemente emotivi.
DJI Romo 2: tante novità lo rendono un robot completo
DJI Romo 2: tante novità lo rendono un robot completo
Romo 2 è la seconda generazione di robot lavapavimenti di DJI, un modello che si caratterizza per la precisione nel sistema di navigazione e per il funzionamento particolarmente silenzioso. Con le modifiche introdotte in questa seconda versione, e un posizionamento di prezzo più allineato alla concorrenza, rappresenta una valida alternativa sul mercato delle soluzioni di pulizia domestica
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 02-07-2008, 15:08   #1
Lelex82
Member
 
Iscritto dal: Mar 2006
Città: Napoli
Messaggi: 170
[C fedora] problemi con la free ()

ho implementato il seguente codice che praticamente è l'eliminazione di un nodo di tipo treenode, da un albero binario di ricerca:
Codice:
void TREE_DELETE (treenode_ptr *root,treenode_ptr node_del,struct timeval curr_time,struct CTRL_header* ctrl_head,char** buffer,int *buffer_length,Active_func_list_Ptr *active_list_ptr, int *actived_mtrcs,char** packet,int *coll_sock_descrp,int * sent_exps,char **argv)
{
	treenode_ptr tmp,tmp2;
	tmp= (treenode*) malloc( sizeof(treenode));
	tmp->left=NULL;
	tmp->right=NULL;
	tmp->p=NULL;
	if (node_del->left==NULL || node_del->right==NULL) //il nodo da eliminare ha al massimo un figlio (destro o sinistro)
	{
		tmp=node_del;
	}
	else //quando il nodo da eliminare ha due figli
	{
		tmp=TREE_SUCCESSOR (node_del);
	}
	if (tmp->left!=NULL)
	{
		tmp2=tmp->left;
	}
	else
		tmp2=tmp->right;
	if (tmp2!=NULL)
	{
		tmp2->p=tmp->p;
	}
	if (tmp->p==NULL)
	{
		*root=tmp2;
	}
	else
	{
		if (tmp==(tmp->p)->left)
		{
			(tmp->p)->left=tmp2;
		}
		else
			(tmp->p)->right=tmp2;
	}
	if (tmp!=node_del) //cioè se il nodo ha 2 figli quindi si è richiamata la funzione TREE_SUCCESSOR
	{	
		node_del->flow_id=tmp->flow_id;
		node_del->start_time=tmp->start_time;
		node_del->last_update=tmp->last_update;
		node_del->metrics_array=tmp->metrics_array;

		//* Free memory *
		/*if(Delete_Metrics((*active_list_ptr), tmp->metrics_array)==-1)
		{printf("FC: Error deleting metrics\n"); exit(-1);}
		free(tmp->metrics_array);*/
		free((tmp));
		nfm++; //numero di flussi morti
			//printf("FREE MEMORY SUCCESSOR\n");
		CHECK_EXPORTING (&(*root),node_del,curr_time,&(*ctrl_head), &(*buffer), &(*buffer_length), &(*active_list_ptr),&(*actived_mtrcs), &(*packet), &(*coll_sock_descrp),&(*sent_exps),argv);
	}
	else 
	{
		if(Delete_Metrics((*active_list_ptr), node_del->metrics_array)==-1)
			{printf("FC: Error deleting metrics\n"); exit(-1);}
		free(node_del->metrics_array);
		free((node_del));
		nfm++;
		//printf("FREE MEMORY NORMALE\n");
	}
	//return tmp;
	
}
se decommento la free () relativa a tmp il programma in esecuzione abortisce dandomi il seguente errore "double free or corruption (out)"
vorrei capire che differenza c'è tra il puntatore tmp e il puntatore node_del???
perchè per il secondo non mi da problemi la free ,mentre per il primo si?
Lelex82 è offline   Rispondi citando il messaggio o parte di esso
Old 02-07-2008, 15:58   #2
DanieleC88
Senior Member
 
L'Avatar di DanieleC88
 
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
Vuol dire che cerchi di liberare una zona di memoria non allocata: non ho letto il codice perché sono di fretta e non so quindi dirti il perché, ma rivedi ciò che hai scritto.
__________________

C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai!
DanieleC88 è offline   Rispondi citando il messaggio o parte di esso
Old 04-07-2008, 15:04   #3
Lelex82
Member
 
Iscritto dal: Mar 2006
Città: Napoli
Messaggi: 170
Daniele trovi 5 minuti? nn riesco proprio a capire il motivo...
Lelex82 è offline   Rispondi citando il messaggio o parte di esso
Old 04-07-2008, 17:28   #4
DanieleC88
Senior Member
 
L'Avatar di DanieleC88
 
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
Ma in pratica stai solo eliminando un nodo da un albero binario di ricerca? Perché se è così, la funzione è più complessa del necessario, oltre ad avere dei problemi. Ad esempio, perché l'affermazione "il nodo da eliminare ha al massimo un figlio" sia vera, devi prima controllare la possibilità che il nodo non abbia alcun figlio. Non c'è motivo nemmeno di allocare ed inizializzare la memoria di tmp se poi vi assegni un differente indirizzo in ogni caso.

Ti consiglio di usare dei controlli che isolino i diversi casi da controllare (nodo nullo, nodo senza figli, nodo con un figlio, nodo con due figli), il codice si ridurrà molto e ne guadagnerai in chiarezza. Tempo fa avevo scritto questa funzione:
Codice:
BNode *BSearchTree_DeleteNode(BNode *t)
{
	BNode *pTemp = NULL;

	/* Nothing to do */
	if (t == NULL)
	{
		return NULL;
	}

	/* No children */
	if ((t->pLeft == NULL) && (t->pRight == NULL))
	{
		BTree_DeleteNode(t);
		return NULL;
	}

	/* One child */
	if ((t->pLeft != NULL) || (t->pRight != NULL))
	{
		pTemp = ((t->pLeft != NULL) ? t->pLeft : t->pRight);
		BTree_DeleteNode(t);
		return pTemp;
	}

	/* Find the in-order successor */
	pTemp = t->pLeft;
	while (pTemp)
	{
		pTemp = pTemp->pRight;
	}

	t->nData = pTemp->nData;
	BTree_DeleteNode(pTemp);
	return t;
}
(dove BTree_DeleteNode() non fa altro che chiamare una free()) che fa esattamente quello che credo tu voglia fare, ovvero eliminare un particolare nodo all'interno di un albero binario di ricerca; se vuoi, la puoi facilmente riadattare ai tuoi scopi.

ciao
__________________

C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai!
DanieleC88 è offline   Rispondi citando il messaggio o parte di esso
Old 05-07-2008, 10:31   #5
Lelex82
Member
 
Iscritto dal: Mar 2006
Città: Napoli
Messaggi: 170
si l'idea di base è l'eliminazione di un nodo da un albero binario di ricerca, con la variante che bisogna fare un controllo se il nodo da eliminare ha due figli e quindi si richiama la funzione SUCCESSOR().
cmq ho risolto, praticamente andavo a deallocare una zona di memoria che successivamente era di nuovo puntata, quindi al nuovo accesso il puntatore nn aveva riferimenti.
grazie cmq dell'aiuto
Lelex82 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Insta360 Luna Ultra: la potenza del sensore da 1 pollice incontra la portabilità estrema Insta360 Luna Ultra: la potenza del sensore da 1...
Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa Marvel's Wolverine, la recensione: Logan torna p...
DJI Romo 2: tante novità lo rendono un robot completo DJI Romo 2: tante novità lo rendono un ro...
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED Sony Bravia 9 II: il True RGB alla prova, dove l...
Geely EX5, un mese al volante: il SUV elettrico cinese che ci ha sorpreso (quasi) senza riserve Geely EX5, un mese al volante: il SUV elettrico ...
Diesel alle stelle e benzina in rialzo: ...
Un bambino di 9 anni clicca su 'Promuovi...
Costruito per durare: verso un'operativi...
Il Galaxy A18 4G è ufficiale: un ...
Claude vuole leggerti anche il conto in ...
Apple inserisce l'iMac 21,5 pollici del ...
GeForce RTX 6000: design a chiplet e arr...
Questi oggetti non dovrebbero esistere, ...
Un ESP32, un modulo ECG e un bottone cuc...
Grazie a un lancio preciso, il Nancy Gra...
Centrali elettriche libere di inquinare:...
Un razzo spaziale Vega C dell'italiana A...
Mozilla: i modelli IA aperti sono solo 4...
Intel e SK hynix al tavolo per un'allean...
Osservare la Luna con la NASA, anche in ...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 12:48.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v