El objeto centinela es un patrón, pero no estoy seguro de cuál de los siguientes (tal vez todos).
Los programas de C++ a menudo se basan en gran medida en el conocimiento cuando se destruye exactamente un objeto (posiblemente de una clase definida por el usuario), es decir, cuando se llama a su destructor. Este no es el caso para los idiomas con recolección de basura.
Esta técnica se utiliza, por ejemplo, para adoptar el paradigma "Inicialización de adquisición de recursos es inicialización": adquiere recursos cuando se llama a un constructor de objetos, y el compilador llama automáticamente a su destructor para liberar recursos tanto normales como anormales (excepcionales) situaciones (marque this question).
Los lugares más comunes donde se puede utilizar el conocimiento del tiempo de construcción/destrucción son
Bloques: un destructor para "apilar-asignado" objeto se llama al final del bloque
void function()
{ Class foo = Object(resource);
other_operations();
} // destructor for foo is called here
Llamadas a funciones: "stack-allocation" también ocurre cuando llama a una función
void function()
{ another_function (Class(resource) );
// destructor for the unnamed object is called
// after another_function() returns (or throws)
other_operations();
}
Construcción/Destrucción del objeto que contiene:
class Foo
{ Class sentry;
public: Foo()
{ // Constructor for sentry is called here
something();
}
public: ~Foo()
{
something();
} // destructor for sentry is called here
};
En STL hay una clase llamada sentry
(más exactamente, istream::sentry
), que implementa el tercer patrón de los descritos anteriormente . Así que creo que eso es lo que algunos programadores llaman "objeto centinela".
Pero, de hecho, cualquiera de los objetos anteriores de la clase Class
se puede llamar "objeto centinela". Son "centinelas" porque aseguran que estos esquivos destructores de objetos no se pierdan incluso si algo arroja una excepción (por lo que son como guardianes del bloque/clase, de tipo).
Más ejemplos de objetos sentry están en ese RAII question.
Puede ver una relación con la programación orientada a aspectos; estos objetos son algo así como "aspectos", con puntos de corte "al principio/final del bloque envolvente", "en la construcción/destrucción del objeto contenedor", etc. Pero estos "aspectos" tienen a presente en el código que aspectan. Por lo tanto, son menos "aspecto" en comparación con la funcionalidad original call/return
; en cambio, un objeto centinela se debe insertar a cada función de la clase:
class X{
struct Sentry {
Sentry() { /* call() */}
~Sentry() { /* return() */};
};
void member_function()
{ Sentry();
/* operations */
}
void another_member_function()
{ Sentry();
/* operations */
}
};
Aparte de esta pregunta es muy probable que sea una tontería, por favor, no etiquete sus preguntas con ninguna etiqueta relacionada con Visual Studio cuando haga preguntas genéricas de C++. –
@Pavel Hice la búsqueda y no encontré –
@Pavel lo siento es mi primera pregunta –