[MontelLUG] Il problema del distruttore misterioso

Davide Rondini davide.rondini a gmail.com
Mer 12 Set 2007 10:30:03 CEST


Ciao,

Si tratta di un problema di allocazione della memoria in C++ che mi
lascia perplesso, perché pare comportarsi contro quanto è la teoria
del C++.

Si tratta di una classe di questo tipo:

class Sample {

public:
     Sample();
     virtual ~Sample();

     void method();

private:
     int *dato;
}

L'implementazione dei metodi è tipo questa:

Sample::Sample() {
     dato = NULL;
}

Sample::method() {
    if (condition) {
        dato = new int[n];
   }
}

Sample::~Sample() {
    if (dato != NULL)
       delete [] dato;
}

In pratica, alloco il puntatore "dato" solo se mi serve per alcune
operazioni. Quindi per non lasciare memory leak faccio il delete nel
distruttore. Ora, questo porta a un errore delle glibc che dice
"double free or corruption", di cui si trova scarsa documentazione in
rete. In effetti in molti casi togliendo il delete dal distruttore
sembra funzionare, ma in alcuni casi porta a bloccare il sistema
proprio come se venissero allocati una serie di dati mai liberati
(come da manuale, il C++ non fa il garbage collection in automatico).
La cosa mi lascia perciò basito. Ma so che gli esperti del gruppo
hanno la soluzione per me :-D

Ciao
CD




More information about the montellug mailing list