|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Member
Iscritto dal: Nov 2004
Città: Roma e Palermo
Messaggi: 204
|
[c++] problema new delete e vector
allora, ho del codice preesistente che suppongo crei dei memory leak, volevo dargli una sistemata ma ho trovato qualche problema, questo è il codice:
Codice:
[...]
unsigned shape_count = 0;
vector<double*> pvec, svec, cvec, fmvec, fsdvvec;
vector<double> avec;
//for all points of contour
for (; cont; cont = cont->h_next)
{
[...]
{
[...]
double *feature = new double[3];
double *color = new double[3];
double *position = new double[2];
compute_shape_feature(points, shape_num_point, shape_per, shape_area, feature, position, newFeatures, subImageMargin, startP, endP);
compute_color_feature(imgN, position, color);
[...]
//QUESTA DICHIARAZIONE L'HO MESSA IO, E' CORRETTO COME ALLOCO IL VETTORE E COME LIBERO LA MEMORIA?
GlcmMatrix *directionalGLCM[4];
directionalGLCM[0] = new GlcmMatrix(GlcmLevel, WindowSize, 1, 0);
directionalGLCM[1] = new GlcmMatrix(GlcmLevel, WindowSize, 1, -1);
directionalGLCM[2] = new GlcmMatrix(GlcmLevel, WindowSize, 0, 1);
directionalGLCM[3] = new GlcmMatrix(GlcmLevel, WindowSize, 1, 1);
[...]
//free the memory
for (int k = 0; k < 4; k++)
{
delete directionalGLCM[k];
}
#ifdef DEBUG
cout << endl << "Shape " << shape_count << "------------------" << endl;
cout << "Contour's points: " << shape_num_point << endl;
cout << "Perimeter: " << shape_per << endl;
cout << "Area: " << shape_area << endl;
cout << "Feature: " << feature[0] << " " << feature[1] << " " << feature[2] << endl;
cout << "Color: " << color[0] << " " << color[1] << " " << color[2] << endl;
cout << "Center Position: " << position[0] << " " << position[1] << endl;
#else
cout << ".";
pvec.push_back(position);
cvec.push_back(color);
svec.push_back(feature);
avec.push_back(shape_area);
#endif
//[red]memory leak!!! SE LO DECOMMENTO MEMORIZZA NEL FILE SOLO L'ULTIMO INSIEME DI VALORI RIPETUTO TANTE VOLTE QUANTE ESEGUE IL CICLO[/red]
//delete [] feature;
//delete [] color;
//delete [] position;
}
}
[...]
cout << "ok" << endl;
vector<double*>::iterator its = svec.begin(), itc = cvec.begin(), itp = pvec.begin();
vector<double>::iterator ita = avec.begin();
//append to file
fprintf(pFile, "%s\n", fname.str().c_str());
fprintf(pFile, "%d\n", shape_count);
while(its != svec.end())
{
fprintf(pFile,"%f\n", *ita);
fprintf(pFile, "%f %f\n", (*itp)[0], (*itp)[1]);
fprintf(pFile, "%f %f %f\n", (*its)[0], (*its)[1], (*its)[2]);
fprintf(pFile, "%f %f %f\n", (*itc)[0], (*itc)[1], (*itc)[2]);
its++; itc++; itp++; ita++;
}
Ho provato anche a dichiarare questi: Codice:
double *feature = new double[3]; double *color = new double[3]; double *position = new double[2]; Codice:
double feature[3]; double color[3]; double position[2]; Ho anche provato a spostare fuori da ciclo sia le dichiarazioni delle variabili (prima dell'ingresso del ciclo) e il loro delete (dopo la fine del ciclo), ma il risultato non cambia. E' corretto lasciar le cose così? |
|
|
|
|
|
#2 |
|
Registered User
Iscritto dal: May 2009
Messaggi: 300
|
Il codice che hai scritto è frammentario... per quanto ne so quelle classi potrebbero contenere campi allocati dinamicamente e non prevedere un distruttore. Io ti consiglio di prestare più attenzione e valutare bene se è davvero necessario l'uso della memoria dinamica. A questo punto una programmazione meticolosa dovrebbe ridurre al minimo i danni. Ad ogni modo uno strumento come "valgrind" dovrebbe darti una mano ad individuare la magagna!
|
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Oct 2005
Messaggi: 3306
|
Solo una domanda perchè non usi vector al posto di gestire manualmente gli array?
Per chiarire i tuoi dubbi: hai usato vector<double*>, se fai il delete degli array poi chiaramente non hai più i valori a disposizione nel vector. Devi deallocare tutti gli elementi solo dopo averli usati. Ti consiglierei di usare vector<double> al posto di vector<double*> |
|
|
|
|
|
#4 | |
|
Member
Iscritto dal: Nov 2004
Città: Roma e Palermo
Messaggi: 204
|
Quote:
|
|
|
|
|
|
|
#5 | |
|
Member
Iscritto dal: Nov 2004
Città: Roma e Palermo
Messaggi: 204
|
Quote:
Ma lasciandolo così, con solo quello che vedete dato che il resto è apposto, crea memory leak non deallocare quei tre vettori double, o va bene? |
|
|
|
|
|
|
#6 | ||
|
Senior Member
Iscritto dal: Oct 2005
Messaggi: 3306
|
Quote:
Dal codice si vede che quegli array sono valorizzati da compute_shape_feature, usare un vector è molto più comodo. Quote:
Chiaro che così non funziona. |
||
|
|
|
|
|
#7 |
|
Member
Iscritto dal: Nov 2004
Città: Roma e Palermo
Messaggi: 204
|
credo di aver capito.
Ma considerando il fatto che il file viene scritto alla fine del programma e che poi questo termini, SE alla chiusura del programma tutta la memoria che occupava viene liberata, credo sia inutile fare il delete (questo però avviene alla chiusura del programma?) Un altro consiglio, mi conviene spostare all'interno del primo for la scrittura del file in modo da avere cicli in meno? Io suppongo di si. |
|
|
|
|
|
#8 | |
|
Registered User
Iscritto dal: May 2009
Messaggi: 300
|
Quote:
|
|
|
|
|
|
|
#9 |
|
Member
Iscritto dal: Nov 2004
Città: Roma e Palermo
Messaggi: 204
|
e spostando la scrittura del file dentro il ciclo for, risparmierei tempo rispetto a com'è adesso che uso un while per scrivere il file, giusto?
|
|
|
|
|
|
#10 |
|
Registered User
Iscritto dal: May 2009
Messaggi: 300
|
Sinceramente non ho capito! Adesso cicli N volte il for ed M volte il while. Ottieni N*M scritture del file. Ovvio che se lo metti fuori dal while ne fai solo N, ma devi vedere se puoi farlo. Se quel while esiste ci sarà un motivo no?
|
|
|
|
|
|
#11 | |
|
Member
Iscritto dal: Nov 2004
Città: Roma e Palermo
Messaggi: 204
|
Quote:
In pratica quel while esiste per scrivere in testa agli elementi del file, il numero totale di shape_count. Pensavo quindi di fare il conto degli shape_count prima, in modo da non dovermi trascinare troppe variabili da deletare, e scrivere il file direttamente nel ciclo for, invece che fuori. |
|
|
|
|
|
|
#12 |
|
Registered User
Iscritto dal: May 2009
Messaggi: 300
|
Se il tuo problema è ottimizzare le vie in linea di principio sono:
1) Evitare il più possibile operazioni di I/O 2) Evitare il più possibile allocazione dinamica 3) Cercare di ridurre il più possibile le operazioni all'interno dei cicli |
|
|
|
|
|
#13 |
|
Member
Iscritto dal: Nov 2004
Città: Roma e Palermo
Messaggi: 204
|
perfetto grazie
un ultima cosa, questa allocazione/deallocazione è corretta vero? (nell'oggetto non ci sono tipi dinamici) Codice:
GlcmMatrix *directionalGLCM[4];
directionalGLCM[0] = new GlcmMatrix(GlcmLevel, WindowSize, 1, 0);
directionalGLCM[1] = new GlcmMatrix(GlcmLevel, WindowSize, 1, -1);
directionalGLCM[2] = new GlcmMatrix(GlcmLevel, WindowSize, 0, 1);
directionalGLCM[3] = new GlcmMatrix(GlcmLevel, WindowSize, 1, 1);
[...]
//free the memory
for (int k = 0; k < 4; k++)
{
delete directionalGLCM[k];
}
|
|
|
|
|
|
#14 |
|
Registered User
Iscritto dal: May 2009
Messaggi: 300
|
Si è corretto...
Ultima modifica di Ikon O'Cluster : 06-10-2009 alle 22:01. |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 05:53.




















