PDA

Visualizza la versione completa : [C/C++]Problema con istruzione free


Marco1995
09-02-2013, 15:47
Ciao ragazzi,sono sempre io :D .Ho un problema con l'istruzione free,in particolare come se non riuscisse a restituirmi lo spazio allocato.
Ma veniamo al codice:


#include <iostream>
#include <fstream>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
using namespace std;
int ContaParole(char* supporto);
int* CreaCifra(char* supporto,int numeroparole);
int main()
{
ifstream numeri;
char supporto[256];
int nparole;
numeri.open("Somma.txt",ios::in|ios::out|ios::app);
while(numeri.good())
{

numeri.getline(supporto,256);
nparole = ContaParole(supporto);
int* vet = (int*) calloc (nparole+1,sizeof(int));
vet = CreaCifra(supporto,nparole);
cout << vet[0];
free(vet);

}

return 0;
}
int* CreaCifra(char* supporto,int numeroparole)
{
int i,k=0,posizione = 0,indicecifra;
int* cifre = (int*) calloc(numeroparole,sizeof(int));
char* cifra = (char*) calloc(8,sizeof(char));
do
{
indicecifra = 0;
for (i=k;((supporto[i]!=' ')&&(supporto[i]!='\0'));i++)
{
cifra[indicecifra++] = supporto[i];
k++;
}
cifra[i]='\0';
if (!strcmp("uno",cifra))
cifre[posizione++] = 1;
if (!strcmp("due",cifra))
cifre[posizione++] = 2;
if (!strcmp("tre",cifra))
cifre[posizione++] = 3;
if (!strcmp("quattro",cifra))
cifre[posizione++] = 4;
if (!strcmp("cinque",cifra))
cifre[posizione++] = 5;
if (!strcmp("sei",cifra))
cifre[posizione++] = 6;
if (!strcmp("sette",cifra))
cifre[posizione++] = 7;
if (!strcmp("otto",cifra))
cifre[posizione++] = 8;
if (!strcmp("nove",cifra))
cifre[posizione++] = 9;
if (!strcmp("zero",cifra))
cifre[posizione++] = 0;
k++;
for (int j=0;j<indicecifra;j++)
cifra[j]=0;
}
while(k<strlen(supporto));
// free(cifra);
return cifre;
}
int ContaParole(char* supporto)
{
int i,j,k=0,nparole=0;

for (i=0;supporto[i]!='\0';i++)
if (supporto[i]==' ')
nparole++;


return nparole;
}

Il problema sta nella funzione CreaCifra quando tento di deallocare la memoria occupata da 'cifra'.
Poi ci sarebbe un altro problema:provando a commentare l'istruzione free(cifra) (ovvero non deallocando lo spazio) la funzione viene eseguita con successo ma l'esecuzione si blocca al main.
Premetto che 'debuggando' funziona correttamente,ma quando tento di eseguirlo si pianta.
Non riesco davvero a capirne il motivo :dh:
Ah.. P.s.Il file "Somma.txt" un file di testo contenente le seguenti righe

otto cinque nove stop
due due stop
sette zero sette stop

Grazie delle risposte.. :ciauz:

oregon
09-02-2013, 20:23
Nel ciclo in cui assegni

i=k

k aumenta sempre di pi e ti ritrovi il valore di i assegnato al vettore cifra[] molto pi grande di 8 che il suo massimo allocato ...

Marco1995
10-02-2013, 13:43
Nel ciclo in cui assegni

i=k

k aumenta sempre di pi e ti ritrovi il valore di i assegnato al vettore cifra[] molto pi grande di 8 che il suo massimo allocato ...

Grazie!!Il problema era proprio quello ...ma come fa questo problema ad essere collegato a quello del main che ti avevo detto? :confused:

Ad ogni modo grazie della risposta,come sempre gentilissimo. :ciauz:
EDIT:
P.s
Qualora a qualcuno interessasse ho risolto dichiarando una variabile chiamata "terminatore"...ad ogni ciclo do la inizializzo a 0 mentre all'interno del ciclo for la faccio incrementare di 1...successivamente faccio

cifra[terminatore]='\0'
:ciauz:

oregon
10-02-2013, 16:15
Originariamente inviato da Marco1995
ma come fa questo problema ad essere collegato a quello del main

Con il problema dell'indice tu andavi a scrivere oltre l'area allocata con la malloc e la free si accorge dell'area "sporca"...

Marco1995
10-02-2013, 17:56
Con il problema dell'indice tu andavi a scrivere oltre l'area allocata con la malloc e la free si accorge dell'area "sporca"...
Ahh..adesso ho capito...grazie mille . .a volte il C/C++ sa essere molto pericoloso. :/
:ciauz:

Loading