Pregunta

En mis navegaciónes por Internet me encontré con esta publicación, que incluye este

"(Bien escrito) C ++ hace todo lo posible para hacer que los objetos automáticos de la pila funcionen" como "primitivas, como se refleja en el consejo de Stroustrup de" hacer como lo hacen los ints ".Esto requiere una adherencia mucho mayor a los principios del desarrollo orientado a objetos:Su clase no es correcta hasta que "funciona como" un int, siguiendo la "regla de tres" que garantiza que puede (al igual que un int) ser creado, copiado y destruido correctamente como una pila automática ".

He hecho un poco de código C y C++, pero de pasada, nunca nada serio, pero tengo curiosidad, ¿qué significa exactamente?

¿Alguien puede dar un ejemplo?

¿Fue útil?

Solución

El compilador maneja automáticamente los objetos de la pila.

Cuando se sale del alcance, se elimina.

{
   obj a;
} // a is destroyed here

Cuando haces lo mismo con un objeto 'nuevo', obtienes una pérdida de memoria:

{
    obj* b = new obj;
}

b no se destruye, por lo que perdimos la capacidad de recuperar la memoria que posee b.Y quizás peor aún, el objeto no puede limpiarse por sí solo.

En C lo siguiente es común:

{
   FILE* pF = fopen( ... );
   // ... do sth with pF
   fclose( pF );
}

En C++ escribimos esto:

{
   std::fstream f( ... );
   // do sth with f
} // here f gets auto magically destroyed and the destructor frees the file

Cuando olvidamos llamar a fclose en el ejemplo de C, el archivo no se cierra y no puede ser utilizado por otros programas.(p.ej.no se puede borrar).

Otro ejemplo, que demuestra la cadena de objetos, que se puede construir, asignar y destruir al salir del alcance.

{
   string v( "bob" );
   string k;

   v = k
   // v now contains "bob"
} // v + k are destroyed here, and any memory used by v + k is freed

Otros consejos

Además de las otras respuestas:

El lenguaje C++ en realidad tiene la auto palabra clave para declarar explícitamente la clase de almacenamiento de un objeto.Por supuesto, es completamente innecesario porque esta es la clase de almacenamiento implícita para variables locales y no se puede utilizar en ningún lugar.Lo contrario a auto es static (tanto a nivel local como global).

Las dos declaraciones siguientes son equivalentes:

int main() {
    int a;
    auto int b;
}

Debido a que la palabra clave es completamente inútil, en realidad será reciclada en el próximo estándar C++ (“C++0x”) y obtendrá un nuevo significado, es decir, permite al compilador inferir el tipo de variable a partir de su inicialización (como var Cª#):

auto a = std::max(1.0, 4.0); // `a` now has type double.

Las variables en C++ se pueden declarar en la pila o en el montón.Cuando declaras una variable en C++, automáticamente va a la pila, a menos que uses explícitamente el nuevo operador (va al montón).

MyObject x = MyObject(params); // onto the stack

MyObject * y = new MyObject(params); // onto the heap

Esto marca una gran diferencia en la forma en que se gestiona la memoria.Cuando una variable se declara en la pila, se desasignará cuando salga del alcance.Una variable en el montón no se destruirá hasta que se llame explícitamente a eliminar en el objeto.

La pila automática son variables que se asignan en la pila del método actual.La idea detrás del diseño de una clase que pueda actuar como Stack automática es que debería ser posible inicializarla completamente con una llamada y destruirla con otra.Es esencial que el destructor libere todos los recursos asignados por el objeto y su constructor devuelva un objeto que haya sido completamente inicializado y listo para su uso.Lo mismo ocurre con la operación de copia: la clase debería poder realizar copias fácilmente, que sean completamente funcionales e independientes.

El uso de dicha clase debería ser similar a cómo primitivo int, float, etc.son usados.Los defines (eventualmente les das un valor inicial) y luego los pasas y al final dejas que el compilador se limpie.

Corríjame si me equivoco, pero creo que la operación de copia no es obligatoria para aprovechar al máximo la limpieza automática de la pila.Por ejemplo, considere un objeto MutexGuard clásico, no necesita una operación de copia para ser útil como pila automática, ¿o no?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top