QScopedPointer Class
template <typename T, typename Cleanup> class QScopedPointerLa classe `QScopedPointer` stocke un pointeur vers un objet alloué dynamiquement et le supprime lors de sa destruction. En savoir plus...
| En-tête : | #include <QScopedPointer> |
| CMake : | find_package(Qt6 REQUIRED COMPONENTS Core) target_link_libraries(mytarget PRIVATE Qt6::Core) |
| qmake : | QT += core |
| Hérité par : |
Remarque : toutes les fonctions de cette classe sont réentrantes.
Fonctions publiques
| 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 |
Éléments non membres associés
| 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) |
Description détaillée
La gestion manuelle des objets alloués sur le tas est difficile et source d'erreurs, ce qui se traduit souvent par des fuites de mémoire et un code difficile à maintenir. QScopedPointer est une petite classe utilitaire qui simplifie considérablement cette tâche en attribuant la propriété de la mémoire de la pile aux allocations du tas, ce que l'on appelle plus généralement « l'acquisition de ressources lors de l'initialisation » (RAII). Le paramètre de modèle T spécifie le type du pointeur géré.
QScopedPointer garantit que l’objet pointé sera supprimé lorsque la portée actuelle disparaîtra.
Prenons l’exemple de cette fonction qui effectue des allocations sur le tas et comporte plusieurs points de sortie :
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;
}Elle est alourdie par les appels manuels à `delete`. Avec `QScopedPointer`, le code peut être simplifié comme suit :
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());
}Le code généré par le compilateur pour QScopedPointer est identique à celui écrit manuellement. Les codes utilisant delete sont des candidats à l’utilisation de QScopedPointer (et si ce n’est pas le cas, éventuellement un autre type de pointeur intelligent tel que QSharedPointer). QScopedPointer ne dispose intentionnellement ni de constructeur de copie ni d’opérateur d’affectation, afin que la propriété et la durée de vie soient clairement communiquées.
La qualification `const` sur un pointeur C++ classique peut également être exprimée avec 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());Gestionnaires de nettoyage personnalisés
Les tableaux ainsi que les pointeurs alloués à l’aide de ` malloc ` ne doivent pas être supprimés à l’aide de ` delete`. Le paramètre de modèle ` Cleanup ` spécifie le gestionnaire de nettoyage à utiliser lors de la destruction du pointeur à portée ; `QScopedPointerDeleter` est utilisé par défaut.
Les gestionnaires de nettoyage personnalisés suivants existent :
- QScopedPointerDeleter — par défaut, supprime le pointeur à l’aide de
delete - QScopedPointerArrayDeleter : supprime le pointeur à l’aide de
delete []. Utilisez ce gestionnaire pour les pointeurs alloués avecnew []. - QScopedPointerPodDeleter : supprime le pointeur à l’aide de `
free()`. Utilisez ce gestionnaire pour les pointeurs alloués avec `malloc()`. - QScopedPointerDeleteLater - supprime un pointeur en appelant la fonction
deleteLater()sur celui-ci. Utilisez ce gestionnaire pour les pointeurs vers des objets de type QObject qui participent activement à une instance de QEventLoop.
Vous pouvez passer vos propres classes en tant que gestionnaires, à condition qu’elles disposent d’une fonction statique publique 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);Pointeurs déclarés à l’avance
Les classes déclarées en avance peuvent être utilisées au sein d'un QScopedPointer, à condition que le destructeur de la classe déclarée en avance soit disponible chaque fois qu'un QScopedPointer doit effectuer un nettoyage.
Concrètement, cela signifie que toutes les classes contenant un QScopedPointer pointant vers une classe déclarée en avant doivent disposer de constructeurs, de destructeurs et d’opérateurs d’affectation non inline :
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.
};Sinon, le compilateur génère un avertissement indiquant qu'il est impossible de détruire MyPrivateClass.
Voir également QSharedPointer.
Documentation sur les fonctions membres
[explicit noexcept] QScopedPointer::QScopedPointer(T *p = nullptr)
Crée cette instance de `QScopedPointer` et définit son pointeur sur ` p`.
QScopedPointer::~QScopedPointer()
Détruit cet objet de type ` QScopedPointer `. Supprime l'objet vers lequel pointe son pointeur.
[noexcept] T *QScopedPointer::data() const
Renvoie la valeur du pointeur référencé par cet objet. ` QScopedPointer ` reste propriétaire de l'objet pointé.
[noexcept] T *QScopedPointer::get() const
Identique à ` data()`.
[noexcept] bool QScopedPointer::isNull() const
Renvoie « true » si cet objet fait référence à « nullptr ».
[noexcept(...)] void QScopedPointer::reset(T *other = nullptr)
Supprime l'objet existant vers lequel il pointe (le cas échéant) et définit son pointeur sur other. QScopedPointer détient désormais other et le supprimera dans son destructeur.
Remarque : cette fonction est de type `noexcept` lorsque ` noexcept(Cleanup::cleanup(std::declval<T *>())) ` est ` true`.
[explicit] QScopedPointer::operator bool() const
Renvoie « true » si le pointeur contenu n'est pas « nullptr ». Cette fonction est adaptée à une utilisation dans « if-constructs », par exemple :
if (scopedPointer) {
//...
}Voir également isNull().
[noexcept] bool QScopedPointer::operator!() const
Renvoie « true » si cet objet fait référence à « nullptr ».
Voir aussi isNull().
T &QScopedPointer::operator*() const
Permet d'accéder à l'objet du pointeur de portée.
Si le pointeur contenu est de typ nullptr, le comportement est indéfini.
Voir également ` isNull()`.
[noexcept] T *QScopedPointer::operator->() const
Permet d’accéder à l’objet du pointeur de portée.
Si le pointeur contenu est de type nullptr, le comportement est indéfini.
Voir aussi isNull().
Éléments non membres associés
[noexcept] bool operator!=(const QScopedPointer<T, Cleanup> &lhs, const QScopedPointer<T, Cleanup> &rhs)
Renvoie « true » si « lhs » et « rhs » font référence à des pointeurs distincts.
[noexcept] bool operator!=(const QScopedPointer<T, Cleanup> &lhs, std::nullptr_t)
Renvoie ` true ` si ` lhs ` désigne un pointeur valide (c'est-à-dire non nul).
Voir également QScopedPointer::isNull().
[noexcept] bool operator!=(std::nullptr_t, const QScopedPointer<T, Cleanup> &rhs)
Renvoie ` true ` si ` rhs ` désigne un pointeur valide (c'est-à-dire non nul).
Voir également QScopedPointer::isNull().
[noexcept] bool operator==(const QScopedPointer<T, Cleanup> &lhs, const QScopedPointer<T, Cleanup> &rhs)
Renvoie « true » si « lhs » et « rhs » font référence au même pointeur.
[noexcept] bool operator==(const QScopedPointer<T, Cleanup> &lhs, std::nullptr_t)
Renvoie « true » si « lhs » renvoie à « nullptr ».
Voir aussi QScopedPointer::isNull().
[noexcept] bool operator==(std::nullptr_t, const QScopedPointer<T, Cleanup> &rhs)
Renvoie « true » si « rhs » renvoie à « nullptr ».
Voir également 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.