Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 15

Discussione: [C]Free di una struct

  1. #1

    [C]Free di una struct

    Salve, ho dichiarato la seguente struct:

    codice:
    typedef struct problemData{
    	
    	int n;
    	int m;
    	int num_var;
    	int num_slack;
    	int not_zero_coeff;
    	int solution;
    	int iterations;
    
    	int* way;
    	int* basevar;
    
    	bool art_var;
    	bool first_open;
    	bool* varstate;
    
    	double** mat;
    	
    	char problem_name[50];
    	char* res_name;
    
    }needed_data;
    La utilizzo nel main nel seguente modo:

    codice:
    void main(){
    
    	needed_data data;
    
    	data.res_name = "results.txt";
    
    	// Richiesta inserimento nome file dati
    	do
    	{	
    		printf("\nDigitare il nome del file con i dati del problema: ");
    		scanf("%s",&data.problem_name);
    		printf("\n");
    	}
    	while (!getData(&data));
    
    	simplessoDuale(&data);
    
    	system("pause");
    
    	free(&data);
    }
    Tuttavia quando vorrei liberare la memoria allocata tramite:

    codice:
    free(&data);
    MSV 2005 crasha dicendomi:


    Windows ha generato un punto di interruzione in Simplesso Duale.exe.

    Ciò può essere dovuto a un danneggiamento dell'heap e indica un errore in Simplesso Duale.exe o in una qualunque delle DLL che ha caricato.

    Controllare la finestra di output per ulteriori informazioni diagnostiche.


    Potrei sapere dove sta l'errore e se eventualmente esiste un altro metodo in alternativa
    alla free()? Grazie.

    :master:

  2. #2
    Quella struttura è stata allocata sullo stack, viene deallocata automaticamente quando la funzione termina, non c'è bisogno di usare free (anzi, come puoi vedere giustamente l'applicazione va in crash). Usa free solo per memoria allocata nell'heap con malloc, realloc o calloc.
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    edit.

  4. #4
    MItaly grazie per la risposta celere
    Allora avrei un altro paio di domande:

    1. Ho usato quella struct per evitare (come mi ha chiesto il prof.) di usare var.
    globali, ed evitando le variabili globali, evitando anche di passare 12 argomenti ad
    una funzione VVoVe:. Secondo te visto che la struct è comunque sullo stack
    (come le variabili globali ??) è stato uno spreco di tempo?

    2. Visto che per allocare la matrice "mat" che vedi all'interno della struct, ho poi
    usato la malloc in sottofunzioni per crearla dinamicante, dove la faccio la free?
    Faccio una funzione che mi deallochi solo la matrice e tutto ciò che ho di dinamico
    ma non il suo "contenitore" struct?


    Scusate se non sono chiaro nell'esprimermi ma son fuso :berto:

  5. #5
    1. No, si tende a non usare variabili globali non per come sono allocate (anzi, l'allocazione sullo stack di solito è meglio perché non bisogna ricordarsi di deallocare memoria manualmente), ma per altri motivi. In ogni caso le variabili globali non vengono allocate sullo stack, ma in un'area particolare di memoria a loro riservata.
    2. Deallochi la matrice quando non ti serve più. Difficile dire a priori esattamente dove senza sapere come funziona il tuo programma.
    Amaro C++, il gusto pieno dell'undefined behavior.

  6. #6
    Grazie ancora.
    Un'ultima cosa io avevo intenzione di fare una cosa del genere:

    codice:
    void struct_free(needed_data* data){
    
       free(data->mat);
       ...
    
    }
    Ma ricevo lo stesso errore. In questo caso non sto cercando di far rilasciare dallo stack
    la struct, ma bensì una sua componente (appunto la matrice).
    E' sempre la stessa cosa? Come faccio altrimenti?

  7. #7
    Come hai allocato data->mat?
    Amaro C++, il gusto pieno dell'undefined behavior.

  8. #8
    Originariamente inviato da MItaly
    Come hai allocato data->mat?
    Si scusa hai ragione sei stato anche troppo educato

    codice:
    bool getData (needed_data* data){
    	//Alloco lo spazio necessario alle righe della matrice
    	if((data->mat = (double**)malloc((data->num_var+1)*(sizeof(double*)))) == NULL){
    		printf("\n\nErrore nell'allocazione delle righe della matrice o spazio insufficiente.\n\n");
    		return FALSE;
    	}
    
    	//Alloco lo spazio necessario alle colonne della matrice (al più n+m+1 per le variabili artificiali)
    	for (i=0; i<=data->num_var+1; i++)
    		if((data->mat[i] = (double*)malloc((data->num_var+data->m+1)*sizeof(double))) == NULL){
    			printf("\n\nErrore nell'allocazione delle colonne della matrice o spazio insufficiente.\n\n");
    			return FALSE;
    	}
    
    return TRUE;
    }

  9. #9
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Guarda che in questa riga

    for (i=0; i<=data->num_var+1; i++)

    ci sia qualcosa che non va ... potrei sbagliare, ma mi sa che deve essere

    for (i=0; i<data->num_var+1; i++)
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  10. #10
    Originariamente inviato da oregon
    Guarda che in questa riga

    for (i=0; i<=data->num_var+1; i++)

    ci sia qualcosa che non va ... potrei sbagliare, ma mi sa che deve essere

    for (i=0; i<data->num_var+1; i++)
    Si sbagliavo ad inizializzare.
    In ogni caso come faccio a liberare lo spazio allocato dalla matrice nella struct avendola
    allocata in quel modo?

    codice:
    free(data->mat);
    non funge
    Devo farmi un ciclo che fa la free per ogni riga ed uno per ogni colonna?

    Help...

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.