src/corelib/tools/qscopedpointer.cpp
changeset 0 1918ee327afb
child 3 41300fa6a67c
equal deleted inserted replaced
-1:000000000000 0:1918ee327afb
       
     1 /****************************************************************************
       
     2 **
       
     3 ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
       
     4 ** All rights reserved.
       
     5 ** Contact: Nokia Corporation (qt-info@nokia.com)
       
     6 **
       
     7 ** This file is part of the QtCore module of the Qt Toolkit.
       
     8 **
       
     9 ** $QT_BEGIN_LICENSE:LGPL$
       
    10 ** No Commercial Usage
       
    11 ** This file contains pre-release code and may not be distributed.
       
    12 ** You may use this file in accordance with the terms and conditions
       
    13 ** contained in the Technology Preview License Agreement accompanying
       
    14 ** this package.
       
    15 **
       
    16 ** GNU Lesser General Public License Usage
       
    17 ** Alternatively, this file may be used under the terms of the GNU Lesser
       
    18 ** General Public License version 2.1 as published by the Free Software
       
    19 ** Foundation and appearing in the file LICENSE.LGPL included in the
       
    20 ** packaging of this file.  Please review the following information to
       
    21 ** ensure the GNU Lesser General Public License version 2.1 requirements
       
    22 ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
       
    23 **
       
    24 ** In addition, as a special exception, Nokia gives you certain additional
       
    25 ** rights.  These rights are described in the Nokia Qt LGPL Exception
       
    26 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
       
    27 **
       
    28 ** If you have questions regarding the use of this file, please contact
       
    29 ** Nokia at qt-info@nokia.com.
       
    30 **
       
    31 **
       
    32 **
       
    33 **
       
    34 **
       
    35 **
       
    36 **
       
    37 **
       
    38 ** $QT_END_LICENSE$
       
    39 **
       
    40 ****************************************************************************/
       
    41 
       
    42 #include "qscopedpointer.h"
       
    43 
       
    44 QT_BEGIN_NAMESPACE
       
    45 
       
    46 /*!
       
    47     \class QScopedPointer
       
    48     \brief The QScopedPointer class stores a pointer to a dynamically allocated object, and deletes it upon destruction.
       
    49     \since 4.6
       
    50     \reentrant
       
    51     \ingroup misc
       
    52 
       
    53     Managing heap allocated objects manually is hard and error prone, with the
       
    54     common result that code leaks memory and is hard to maintain.
       
    55     QScopedPointer is a small utility class that heavily simplifies this by
       
    56     assigning stack-based memory ownership to heap allocations, more generally
       
    57     called resource acquisition is initialization(RAII).
       
    58 
       
    59     QScopedPointer guarantees that the object pointed to will get deleted when
       
    60     the current scope dissapears.
       
    61 
       
    62     Consider this function which does heap allocations, and have various exit points:
       
    63 
       
    64     \snippet doc/src/snippets/code/src_corelib_tools_qscopedpointer.cpp 0
       
    65 
       
    66     It's encumbered by the manual delete calls. With QScopedPointer, the code
       
    67     can be simplified to:
       
    68 
       
    69     \snippet doc/src/snippets/code/src_corelib_tools_qscopedpointer.cpp 1
       
    70 
       
    71     The code the compiler generates for QScopedPointer is the same as when
       
    72     writing it manually. Code that makes use of \a delete are candidates for
       
    73     QScopedPointer usage (and if not, possibly another type of smart pointer
       
    74     such as QSharedPointer). QScopedPointer intentionally has no copy
       
    75     constructor or assignment operator, such that ownership and lifetime is
       
    76     clearly communicated.
       
    77 
       
    78     The const qualification on a regular C++ pointer can also be expressed with
       
    79     a QScopedPointer:
       
    80 
       
    81     \snippet doc/src/snippets/code/src_corelib_tools_qscopedpointer.cpp 2
       
    82 
       
    83     \section1 Custom cleanup handlers
       
    84 
       
    85     Arrays as well as pointers that have been allocated with \c malloc must
       
    86     not be deleted using \c delete. QScopedPointer's second template parameter
       
    87     can be used for custom cleanup handlers.
       
    88 
       
    89     The following custom cleanup handlers exist:
       
    90 
       
    91     \list
       
    92     \i QScopedPointerDeleter - the default, deletes the pointer using \c delete
       
    93     \i QScopedPointerArrayDeleter - deletes the pointer using \c{delete []}. Use
       
    94        this handler for pointers that were allocated with \c{new []}.
       
    95     \i QScopedPointerPodDeleter - deletes the pointer using \c{free()}. Use this
       
    96        handler for pointers that were allocated with \c{malloc()}.
       
    97     \endlist
       
    98 
       
    99     You can pass your own classes as handlers, provided that they have a public
       
   100     static function \c{void cleanup(T *pointer)}.
       
   101 
       
   102     \snippet doc/src/snippets/code/src_corelib_tools_qscopedpointer.cpp 5
       
   103 
       
   104     \section1 Forward Declared Pointers
       
   105 
       
   106     Classes that are forward declared can be used within QScopedPointer, as
       
   107     long as the destructor of the forward declared class is available whenever
       
   108     a QScopedPointer needs to clean up.
       
   109 
       
   110     Concretely, this means that all classes containing a QScopedPointer that
       
   111     points to a forward declared class must have non-inline constructors,
       
   112     destructors and assignment operators:
       
   113 
       
   114     \snippet doc/src/snippets/code/src_corelib_tools_qscopedpointer.cpp 4
       
   115 
       
   116     Otherwise, the compiler output a warning about not being able to destruct
       
   117     \c MyPrivateClass.
       
   118 
       
   119     \sa QSharedPointer
       
   120 */
       
   121 
       
   122 /*! \typedef QScopedPointer::pointer
       
   123   \internal
       
   124  */
       
   125 
       
   126 /*!
       
   127     \fn QScopedPointer::QScopedPointer(T *p = 0)
       
   128 
       
   129     Constructs this QScopedPointer instance and sets its pointer to \a p.
       
   130 */
       
   131 
       
   132 /*!
       
   133     \fn QScopedPointer::~QScopedPointer()
       
   134 
       
   135     Destroys this QScopedPointer object. Delete the object its pointer points
       
   136     to.
       
   137 */
       
   138 
       
   139 /*!
       
   140     \fn T *QScopedPointer::data() const
       
   141 
       
   142     Returns the value of the pointer referenced by this object. QScopedPointer
       
   143     still owns the object pointed to.
       
   144 */
       
   145 
       
   146 /*!
       
   147     \fn T &QScopedPointer::operator*() const
       
   148 
       
   149     Provides access to the scoped pointer's object.
       
   150 
       
   151     If the contained pointer is \c null, behavior is undefined.
       
   152     \sa isNull()
       
   153 */
       
   154 
       
   155 /*!
       
   156     \fn T *QScopedPointer::operator->() const
       
   157 
       
   158     Provides access to the scoped pointer's object.
       
   159 
       
   160     If the contained pointer is \c null, behavior is undefined.
       
   161 
       
   162     \sa isNull()
       
   163 */
       
   164 
       
   165 /*!
       
   166     \fn QScopedPointer::operator bool() const
       
   167 
       
   168     Returns \c true if this object is not \c null. This function is suitable
       
   169     for use in \tt if-constructs, like:
       
   170 
       
   171     \snippet doc/src/snippets/code/src_corelib_tools_qscopedpointer.cpp 3
       
   172 
       
   173     \sa isNull()
       
   174 */
       
   175 
       
   176 /*!
       
   177     \fn bool QScopedPointer::operator==(const QScopedPointer<T, Cleanup> &other) const
       
   178 
       
   179     Equality operator. Returns true if the scoped pointer \a other
       
   180     is pointing to the same object as this pointer, otherwise returns false.
       
   181 */
       
   182 
       
   183 
       
   184 /*!
       
   185     \fn bool QScopedPointer::operator!=(const QScopedPointer<T, Cleanup> &other) const
       
   186 
       
   187     Inequality operator. Returns true if the scoped pointer \a other
       
   188     is not pointing to the same object as this pointer, otherwise returns false.
       
   189 */
       
   190 
       
   191 /*!
       
   192     \fn bool QScopedPointer::isNull() const
       
   193 
       
   194     Returns \c true if this object is holding a pointer that is \c null.
       
   195 */
       
   196 
       
   197 /*!
       
   198     \fn void QScopedPointer::reset(T *other = 0)
       
   199 
       
   200     Deletes the existing object it is pointing to if any, and sets its pointer to
       
   201     \a other. QScopedPointer now owns \a other and will delete it in its
       
   202     destructor.
       
   203 */
       
   204 
       
   205 /*!
       
   206     \fn T *QScopedPointer::take()
       
   207 
       
   208     Returns the value of the pointer referenced by this object. The pointer of this
       
   209     QScopedPointer object will be reset to \c null.
       
   210 
       
   211     Callers of this function take ownership of the pointer.
       
   212 */
       
   213 
       
   214 /*! \fn bool QScopedPointer::operator!() const
       
   215 
       
   216     Returns \c true if the pointer referenced by this object is \c null, otherwise
       
   217     returns \c false.
       
   218 
       
   219     \sa isNull()
       
   220 */
       
   221 
       
   222 /*! \fn void QScopedPointer::swap(QScopedPointer<T, Cleanup> &other)
       
   223   Swap this pointer with \a other.
       
   224  */
       
   225 
       
   226 QT_END_NAMESPACE