Sto riscontrando un problema con un distruttore chiamato per una classe alla fine di una subroutine, anche se dovrebbe essere definito al di fuori dell'ambito della subroutine.C++: il distruttore viene chiamato prima che debba uscire dal campo di applicazione?
Ecco il pezzo più piccolo di codice che ho che visualizza il mio problema:
#include <iostream>
using namespace std;
class Foo {
private:
double *array;
public:
Foo(int N) {
array = new double[N];
for (int i=0; i<N; i++) {
array[i]=0;
}
}
~Foo() {
delete[] array;
}
};
void subroutine(Foo x) {
cout << "Hello!" << endl;
}
int main() {
Foo bar(10);
subroutine(bar);
subroutine(bar);
}
Ora il distruttore per la barra degli oggetti qui viene chiamato dopo la prima subroutine termina anche se è portata dovrebbe essere tutta la funzione principale? Ciò significa che quando chiamo la seconda subroutine il distruttore viene chiamato di nuovo e ottengo una perdita di memoria.
Ho trovato che posso risolvere questo problema chiamando per riferimento nella subroutine ma non sono molto soddisfatto di questa correzione poiché non capisco perché non ha funzionato in primo luogo. Qualcuno può far luce su questo per me?
Grazie.
Dato il distruttore, è necessario definire o eliminare il costruttore di copia di 'Foo' e l'operatore di assegnazione copia. Cerca "regola dei tre". –
"Il distruttore viene chiamato per una classe" - scoprirai che, nel tempo, le cose sono molto più chiare se distingui costantemente tra ** classe ** e ** oggetto **. I distruttori sono chiamati su ** oggetti ** non sulle classi. –