QScopedPointer Class
template <typename T, typename Cleanup = QScopedPointerDeleter<T>> class QScopedPointerLa clase QScopedPointer almacena un puntero a un objeto asignado dinámicamente, y lo elimina al destruirlo. Más...
| Cabecera: | #include <QScopedPointer> |
| CMake: | find_package(Qt6 REQUIRED COMPONENTS Core)target_link_libraries(mytarget PRIVATE Qt6::Core) |
| qmake: | QT += core |
| Heredado Por: |
Nota: Todas las funciones de esta clase son reentrantes.
Funciones públicas
| QScopedPointer(T *p = nullptr) | |
| ~QScopedPointer() | |
| T * | data() const |
| T * | get() const |
| bool | isNull() const |
| void | reset(T *other = nullptr) |
| operator bool() const | |
| bool | operator!() const |
| T & | operator*() const |
| T * | operator->() const |
No miembros relacionados
| bool | operator!=(const QScopedPointer<T, Cleanup> &lhs, const QScopedPointer<T, Cleanup> &rhs) |
| bool | operator!=(const QScopedPointer<T, Cleanup> &lhs, std::nullptr_t) |
| bool | operator!=(std::nullptr_t, const QScopedPointer<T, Cleanup> &rhs) |
| bool | operator==(const QScopedPointer<T, Cleanup> &lhs, const QScopedPointer<T, Cleanup> &rhs) |
| bool | operator==(const QScopedPointer<T, Cleanup> &lhs, std::nullptr_t) |
| bool | operator==(std::nullptr_t, const QScopedPointer<T, Cleanup> &rhs) |
Descripción detallada
Gestionar manualmente los objetos asignados al heap es difícil y propenso a errores, con el resultado común de que el código pierde memoria y es difícil de mantener. QScopedPointer es una pequeña clase utilitaria que simplifica en gran medida esto asignando la propiedad de la memoria basada en la pila a las asignaciones de heap, más generalmente llamada adquisición de recursos es inicialización(RAII).
QScopedPointer garantiza que el objeto apuntado será borrado cuando el ámbito actual desaparezca.
Considera esta función que hace asignaciones de heap, y tiene varios puntos de salida:
void myFunction(bool useSubClass) { MyClass *p = useSubClass ? new MyClass() : new MySubClass; QIODevice *device = handsOverOwnership(); if (m_value > 3) { delete p; delete device; return; } try { process(device); } catch (...) { delete p; delete device; throw; } delete p; delete device; }
Está gravada por las llamadas de borrado manual. Con QScopedPointer, el código puede simplificarse a:
void myFunction(bool useSubClass) { // assuming that MyClass has a virtual destructor QScopedPointer<MyClass> p(useSubClass ? new MyClass() : new MySubClass); QScopedPointer<QIODevice> device(handsOverOwnership()); if (m_value > 3) return; process(device.data()); }
El código que genera el compilador para QScopedPointer es el mismo que cuando se escribe manualmente. El código que hace uso de delete es candidato para el uso de QScopedPointer (y si no, posiblemente otro tipo de puntero inteligente como QSharedPointer). QScopedPointer intencionadamente no tiene constructor de copia ni operador de asignación, de forma que la propiedad y el tiempo de vida se comunican claramente.
La calificación const en un puntero C++ normal también puede expresarse con un QScopedPointer:
const QWidget *const p = new QWidget(); // is equivalent to: const QScopedPointer<const QWidget> p1(new QWidget()); QWidget *const p = new QWidget(); // is equivalent to: const QScopedPointer<QWidget> p1(new QWidget()); const QWidget *p = new QWidget(); // is equivalent to: QScopedPointer<const QWidget> p1(new QWidget());
Manejadores de limpieza personalizados
Las matrices así como los punteros que han sido asignados con malloc no deben ser borrados usando delete. El segundo parámetro de plantilla de QScopedPointer puede utilizarse para gestores de limpieza personalizados.
Existen los siguientes gestores de limpieza personalizados:
- QScopedPointerDeleter - por defecto, borra el puntero usando
delete - QScopedPointerArrayDeleter - borra el puntero usando
delete []. Utilice este manejador para punteros que fueron asignados connew []. - QScopedPointerPodDeleter - borra el puntero utilizando
free(). Utilice este controlador para los punteros que se asignaron conmalloc(). - QScopedPointerDeleteLater - borra un puntero llamando a
deleteLater()sobre él. Utilice este manejador para punteros a QObject's que están participando activamente en un QEventLoop.
Puedes pasar tus propias clases como manejadores, siempre que tengan una función estática pública void cleanup(T *pointer).
// this QScopedPointer deletes its data using the delete[] operator: QScopedPointer<int, QScopedPointerArrayDeleter<int> > arrayPointer(new int[42]); // this QScopedPointer frees its data using free(): QScopedPointer<int, QScopedPointerPodDeleter> podPointer(reinterpret_cast<int *>(malloc(42))); // this struct calls "myCustomDeallocator" to delete the pointer struct ScopedPointerCustomDeleter { static inline void cleanup(MyCustomClass *pointer) { myCustomDeallocator(pointer); } }; // QScopedPointer using a custom deleter: QScopedPointer<MyCustomClass, ScopedPointerCustomDeleter> customPointer(new MyCustomClass);
Punteros declarados hacia delante
Las clases que se declaran hacia adelante se pueden utilizar dentro de QScopedPointer, siempre que el destructor de la clase declarada hacia adelante esté disponible siempre que un QScopedPointer necesite limpiarse.
Concretamente, esto significa que todas las clases que contengan un QScopedPointer que apunte a una clase declarada hacia adelante deben tener constructores, destructores y operadores de asignación no en línea:
class MyPrivateClass; // forward declare MyPrivateClass class MyClass { private: QScopedPointer<MyPrivateClass> privatePtr; // QScopedPointer to forward declared class public: MyClass(); // OK inline ~MyClass() {} // VIOLATION - Destructor must not be inline private: Q_DISABLE_COPY(MyClass) // OK - copy constructor and assignment operators // are now disabled, so the compiler won't implicitly // generate them. };
De lo contrario, el compilador emite una advertencia acerca de no ser capaz de destruct MyPrivateClass.
Véase también QSharedPointer.
Documentación de funciones miembro
[explicit noexcept] QScopedPointer::QScopedPointer(T *p = nullptr)
Construye esta instancia QScopedPointer y establece su puntero a p.
QScopedPointer::~QScopedPointer()
Destruye este objeto QScopedPointer. Elimina el objeto al que apunta su puntero.
[noexcept] T *QScopedPointer::data() const
Devuelve el valor del puntero referenciado por este objeto. QScopedPointer sigue siendo el propietario del objeto apuntado.
[noexcept] T *QScopedPointer::get() const
Igual que data().
[noexcept] bool QScopedPointer::isNull() const
Devuelve true si este objeto hace referencia a nullptr.
[noexcept(...)] void QScopedPointer::reset(T *other = nullptr)
Elimina el objeto existente al que está apuntando (si existe), y establece su puntero a other. QScopedPointer es ahora propietario de other y lo eliminará en su destructor.
Nota: Esta función es noexcept cuando noexcept(Cleanup::cleanup(std::declval<T *>())) es true.
[explicit] QScopedPointer::operator bool() const
Devuelve true si el puntero contenido no es nullptr. Esta función es adecuada para su uso en if-constructs, como:
if (scopedPointer) { //... }
Véase también isNull().
[noexcept] bool QScopedPointer::operator!() const
Devuelve true si este objeto hace referencia a nullptr.
Véase también isNull().
T &QScopedPointer::operator*() const
Proporciona acceso al objeto del puntero de ámbito.
Si el puntero contenido es nullptr, el comportamiento es indefinido.
Véase también isNull().
[noexcept] T *QScopedPointer::operator->() const
Proporciona acceso al objeto del puntero de ámbito.
Si el puntero contenido es nullptr, el comportamiento es indefinido.
Véase también isNull().
No miembros relacionados
[noexcept] bool operator!=(const QScopedPointer<T, Cleanup> &lhs, const QScopedPointer<T, Cleanup> &rhs)
Devuelve true si lhs y rhs se refieren a punteros distintos.
[noexcept] bool operator!=(const QScopedPointer<T, Cleanup> &lhs, std::nullptr_t)
Devuelve true si lhs se refiere a un puntero válido (es decir, no nulo).
Véase también QScopedPointer::isNull().
[noexcept] bool operator!=(std::nullptr_t, const QScopedPointer<T, Cleanup> &rhs)
Devuelve true si rhs se refiere a un puntero válido (es decir, no nulo).
Véase también QScopedPointer::isNull().
[noexcept] bool operator==(const QScopedPointer<T, Cleanup> &lhs, const QScopedPointer<T, Cleanup> &rhs)
Devuelve true si lhs y rhs se refieren al mismo puntero.
[noexcept] bool operator==(const QScopedPointer<T, Cleanup> &lhs, std::nullptr_t)
Devuelve true si lhs hace referencia a nullptr.
Véase también QScopedPointer::isNull().
[noexcept] bool operator==(std::nullptr_t, const QScopedPointer<T, Cleanup> &rhs)
Devuelve true si rhs hace referencia a nullptr.
Véase también QScopedPointer::isNull().
© 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.