Tengo un problema con un destructor llamado para una clase al final de una subrutina, aunque debería definirse fuera del alcance de la subrutina.C++: ¿Se ha llamado al destructor antes de que salga del alcance?
Aquí es la más pequeña pieza de código que tengo que muestra mi 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);
}
Ahora el destructor para la barra de objetos que aquí se vuelve a llamar después de la primera subrutina termina pesar de que es alcance debe ser el conjunto de la ¿función principal? Esto significa que cuando llamo a la segunda subrutina se llama al destructor nuevamente y me sale una pérdida de memoria.
He encontrado que puedo solucionar esto llamando por referencia en la subrutina, pero no estoy muy satisfecho con esta corrección ya que no entiendo por qué no funcionó en primer lugar. ¿Alguien puede arrojar algo de luz sobre esto para mí?
Gracias.
Dado su destructor, debe definir o eliminar el constructor de copias y el operador de asignación de copias de 'Foo'. Busque la "regla de tres". –
"se llama al destructor para una clase": verás que, con el tiempo, las cosas son mucho más claras si siempre distingues entre una ** clase ** y un ** objeto **. Los destructores son llamados sobre ** objetos ** que no están en las clases. –