En esta página

QGlobalStatic Struct

template <typename Holder> struct QGlobalStatic

La clase QGlobalStatic se utiliza para implementar un objeto estático global. Más...

Cabecera: #include <QGlobalStatic>
CMake: find_package(Qt6 REQUIRED COMPONENTS Core)
target_link_libraries(mytarget PRIVATE Qt6::Core)
qmake: QT += core

Nota: Todas las funciones de esta estructura son thread-safe.

Tipos Públicos

Funciones Públicas

bool exists() const
bool isDestroyed() const
operator QGlobalStatic<Holder>::Type *()
QGlobalStatic<Holder>::Type &operator*()
QGlobalStatic<Holder>::Type *operator->()

Macros

Q_GLOBAL_STATIC(Type, variableName, ...)

Descripción detallada

La clase QGlobalStatic es el front-end API exportado cuando se usa Q_GLOBAL_STATIC(). Consulte la documentación de la macro para conocer sus requisitos y cuándo utilizarla.

Normalmente, nunca utilizarás esta clase directamente, sino que utilizarás la macro Q_GLOBAL_STATIC(), como se indica a continuación:

Q_GLOBAL_STATIC(MyType, myGlobal)

El ejemplo anterior crea un objeto de tipo QGlobalStatic llamado myGlobal. Después de la declaración anterior, el objeto myGlobal puede ser utilizado como si fuera un puntero a un objeto de tipo MyType, garantizado para ser inicializado exactamente una vez. Además del uso como puntero, el objeto ofrece dos métodos para determinar el estado actual del global: exists() y isDestroyed().

Véase también Q_GLOBAL_STATIC().

Documentación de tipos de miembros

[alias] QGlobalStatic::Type

Este tipo es equivalente al parámetro Type pasado a las macros Q_GLOBAL_STATIC() o Q_GLOBAL_STATIC_WITH_ARGS(). Se utiliza en los tipos de retorno de algunas funciones.

Documentación de funciones miembro

[noexcept] bool QGlobalStatic::exists() const

Esta función devuelve true si el objeto estático global ya ha completado la inicialización (es decir, si el constructor para el tipo ya ha devuelto) y aún no ha completado la destrucción. En particular, observe que esta función devuelve false si la inicialización aún está en curso.

Una vez que esta función ha devuelto true una vez, no volverá a devolver false hasta que el objeto estático global sea destruido. Esto último ocurre al salir del programa o cuando se descarga el complemento o la biblioteca que contiene el objeto global static.

Es seguro llamar a esta función en cualquier punto de la ejecución del programa: no puede fallar y no puede causar un bloqueo. Además, no provocará la creación de los contenidos si aún no se han creado.

Esta función es útil si uno puede determinar las condiciones iniciales del objeto estático global y prefiere evitar una operación de construcción posiblemente costosa.

Por ejemplo, en el siguiente ejemplo de código, esta función se utiliza para cortocircuitar la creación del estático global llamado globalState y devuelve un valor por defecto:

Q_GLOBAL_STATIC(MyType, globalState)
QString someState()
{
    if (globalState.exists())
        return globalState->someState;
    return QString();
}

Aviso de seguridad de hilos: esta función es segura de hilos en el sentido de que puede ser llamada desde cualquier hilo en cualquier momento y siempre devolverá una respuesta válida. Pero debido a la naturaleza no atómica de la construcción, esta función puede devolver false durante un breve periodo de tiempo después de que la construcción haya finalizado.

Aviso sobre el orden de la memoria: esta función no impone ninguna garantía sobre el orden de la memoria. Eso lo proporcionan las funciones accesorias que devuelven el puntero o la referencia al contenido. Si te saltas las funciones accesorias e intentas acceder a algún estado global establecido por el constructor, asegúrate de utilizar la semántica correcta de ordenación de memoria proporcionada por QAtomicInt o QAtomicPointer.

Véase también isDestroyed().

[noexcept] bool QGlobalStatic::isDestroyed() const

Esta función devuelve true si el objeto estático global ya ha completado su destrucción (es decir, si el destructor para el tipo ya ha regresado). En particular, observe que esta función devuelve false si la destrucción aún está en curso.

Una vez que esta función ha devuelto true una vez, no volverá a devolver false hasta que se reinicie el programa o se descargue y vuelva a cargar el complemento o la biblioteca que contiene el objeto global static.

Es seguro llamar a esta función en cualquier punto de la ejecución del programa: no puede fallar y no puede causar un bloqueo. Además, no provocará la creación de los contenidos si aún no se han creado.

Esta función es útil en código que puede ser ejecutado al cierre del programa, para determinar si todavía se puede acceder a los contenidos o no.

Véase también exists().

QGlobalStatic::operator QGlobalStatic<Holder>::Type *()

Esta función devuelve la dirección del contenido de esta estática global. Si el contenido aún no se ha creado, esta función lo creará de forma segura. Si el contenido ya ha sido destruido, esta función devolverá un puntero nulo.

Esta función puede utilizarse, por ejemplo, para almacenar el puntero al contenido de la estática global en una variable local, evitando así múltiples llamadas a la función. La implementación de Q_GLOBAL_STATIC() ya es bastante eficiente, pero en secciones críticas para el rendimiento puede ser útil ayudar un poco al compilador. Por ejemplo:

Q_GLOBAL_STATIC(MyType, globalState)
QString someState()
{
    if (globalState::isDestroyed())
        return QString();
    MyType *state = globalState;
    if (state->condition)
        return state->value;
    else
        return state->worth;
}

Véase también operator->() y operator*().

QGlobalStatic<Holder>::Type &QGlobalStatic::operator*()

Esta función devuelve una referencia al contenido de esta estática global. Si el contenido aún no ha sido creado, será creado de forma segura por esta función.

Esta función no comprueba si el contenido ya ha sido destruido. Si se llama a esta función después de que el objeto haya sido destruido, devolverá una referencia inválida que no debe utilizarse.

Véase también exists() y isDestroyed().

QGlobalStatic<Holder>::Type *QGlobalStatic::operator->()

Esta función devuelve la dirección del contenido de esta estática global. Si el contenido aún no ha sido creado, será creado de forma segura por esta función.

Esta función no comprueba si el contenido ya ha sido destruido y nunca devolverá null. Si se llama a esta función después de que el objeto haya sido destruido, devolverá un puntero colgante al que no se debe hacer referencia.

Véase también exists() y isDestroyed().

Documentación de macros

Q_GLOBAL_STATIC(Type, variableName, ...)

Crea un objeto global y estático de tipo QGlobalStatic, llamado variableName. Se comporta como un puntero a Type. El objeto creado por Q_GLOBAL_STATIC se inicializa a sí mismo en el primer uso, lo que significa que no incrementará el tiempo de carga de la aplicación o de la librería. Además, el objeto se inicializa de forma segura en todas las plataformas.

Desde Qt 6.3, esta macro admite argumentos variadic, que se utilizan para inicializar el objeto, haciendo así innecesaria la necesidad de Q_GLOBAL_STATIC_WITH_ARGS. Tenga en cuenta que los argumentos no requieren un conjunto extra de paréntesis, a diferencia de la macro anterior.

El uso típico de esta macro es el siguiente, en un contexto global (es decir, no dentro de ninguna función o cuerpo de clase):

Q_GLOBAL_STATIC(MyType, myGlobal)

Esta macro está pensada para reemplazar objetos estáticos globales que no sean POD (Plain Old Data, o en términos de C++11, no hechos de un tipo trivial), de ahí su nombre. Por ejemplo, el siguiente código C++ crea un static global:

static MyType myGlobal;

Comparado con Q_GLOBAL_STATIC, y asumiendo que MyType es una clase o struct que tiene un constructor, un destructor, o es de otro modo no-POD, este último tiene los siguientes inconvenientes:

  • requiere la inicialización en tiempo de carga de myGlobal (es decir, se llama al constructor por defecto de MyType cuando se carga la biblioteca o la aplicación);
  • el objeto se inicializará aunque nunca se utilice;
  • el orden de inicialización y destrucción entre diferentes unidades de traducción no está determinado, dando lugar a posibles usos, antes de la inicialización o después de la destrucción, por los constructores o destructores de otras variables globales.

La macro Q_GLOBAL_STATIC resuelve todos estos problemas garantizando una inicialización a prueba de hilos en el primer uso y permitiendo al usuario consultar si el tipo ya ha sido destruido, para evitar el problema del uso después de la destrucción (ver QGlobalStatic::isDestroyed()).

Constructor y Destructor

Para Q_GLOBAL_STATIC, cuando sólo se le da un nombre de tipo y variable, su Type debe ser públicamente constructible por defecto y públicamente destructible. En caso contrario, Type debe tener un constructor público que acepte el resto de argumentos de la macro. Para Q_GLOBAL_STATIC_WITH_ARGS(), debe haber un constructor público que acepte el tercer argumento de la macro como su lista de parámetros.

No es posible utilizar Q_GLOBAL_STATIC con una Type cuyo constructor o destructor relevante esté protegido o sea privado. Si el tipo en cuestión declara esos miembros protegidos, es posible superar el problema derivando del tipo y creando un constructor y un destructor públicos. Si el tipo los declara privados, es necesaria una declaración friend antes de derivar.

Por ejemplo, lo siguiente es suficiente para crear MyType basado en un MyOtherType previamente definido que tiene un constructor por defecto protegido y/o un destructor protegido (o los declara privados, pero también declara MyType como amigo).

class MyType : public MyOtherType { };
Q_GLOBAL_STATIC(MyType, myGlobal)

No se requiere un cuerpo para MyType ya que el destructor es un miembro implícito y también lo es el constructor por defecto si no hay otros constructores definidos. Para su uso con argumentos después de Type y variableName, o con Q_GLOBAL_STATIC_WITH_ARGS(), sin embargo, es necesario un cuerpo constructor adecuado:

class MyType : public MyOtherType
{
public:
    MyType(int i) : MyOtherType(i) {}
};
Q_GLOBAL_STATIC(MyType, myGlobal, 42)

Alternativamente (desde que C++11 introdujo la herencia de constructores), se podría escribir:

class MyType : public MyOtherType
{
public:
    using MyOtherType::MyOtherType;
};
Q_GLOBAL_STATIC_WITH_ARGS(MyType, myGlobal, (42))

Colocación

La macro Q_GLOBAL_STATIC crea un tipo, y una variable de ese tipo que es necesariamente estática, en el ámbito global. No es posible colocar la macro Q_GLOBAL_STATIC dentro de una función o del cuerpo de una clase (hacerlo provocará errores de compilación).

Más importante aún, esta macro debe colocarse en los ficheros fuente, nunca en las cabeceras. Dado que el objeto resultante tiene vinculación estática, si la macro se coloca en una cabecera y se incluye en varios archivos fuente, el objeto se definirá varias veces y no provocará errores de vinculación. En cambio, cada unidad de traducción se referirá a un objeto diferente, lo que podría dar lugar a errores sutiles y difíciles de rastrear.

Tenga en cuenta que no se recomienda utilizar la macro con tipos que sean POD o que tengan constructores constexpr C++11 (trivialmente construibles y destructibles). Para esos tipos, se sigue recomendando usar static normal, ya sea global o local de función.

Esta macro funcionará, pero añadirá una sobrecarga innecesaria.

Reentrada, Seguridad de Hilos, Bloqueos y Seguridad de Excepciones en la Construcción

La macro Q_GLOBAL_STATIC crea un objeto que se inicializa a si mismo en su primer uso de una manera segura para los hilos: si varios hilos intentan inicializar el objeto al mismo tiempo, solo un hilo procederá a inicializarlo, mientras todos los demás hilos esperan a que se complete.

Si el proceso de inicialización lanza una excepción, se considera que la inicialización no se ha completado y se intentará de nuevo cuando el control alcance cualquier uso del objeto. Si hay hilos esperando la inicialización, uno de ellos será despertado para intentar inicializar.

La macro no garantiza la reentrada desde el mismo hilo. Si se accede al objeto estático global directa o indirectamente desde dentro de su propio constructor, seguramente se producirá un bloqueo.

Además, si dos objetos Q_GLOBAL_STATIC están siendo inicializados en dos hilos diferentes y la secuencia de inicialización de cada uno accede al otro, podría producirse un punto muerto. Por esa razón, se recomienda mantener los constructores estáticos globales simples o, en su defecto, asegurarse de que no hay dependencia cruzada de usos de estáticos globales durante la construcción.

Destrucción

Si el objeto nunca se utiliza durante la vida del programa, aparte de las funciones QGlobalStatic::exists() y QGlobalStatic::isDestroyed(), el contenido de tipo Type no se creará y no habrá ninguna operación en tiempo de salida.

Si se crea el objeto, se destruirá al salir, de forma similar a la función atexit() de C. En la mayoría de los sistemas, de hecho, el destructor también será llamado si la librería o plugin es descargado de memoria antes de la salida.

Dado que la destrucción se realiza al salir del programa, no se proporciona seguridad de hilos. Esto incluye el caso de descarga de plugins o librerías. Además, como se supone que los destructores no lanzan excepciones, tampoco se proporciona seguridad de excepciones.

Sin embargo, se permite la reentrada: durante la destrucción, es posible acceder al objeto estático global y el puntero devuelto será el mismo que antes de que comenzara la destrucción. Una vez finalizada la destrucción, no se permite acceder al objeto estático global, excepto en los casos indicados en la API QGlobalStatic.

Véase también Q_APPLICATION_STATIC() y QGlobalStatic.

© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.