Merge remote-tracking branch 'gerrit/master' into containers
[profile/ivi/qtbase.git] / src / corelib / tools / qscopedpointer.cpp
1 /****************************************************************************
2 **
3 ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
4 ** Contact: http://www.qt-project.org/
5 **
6 ** This file is part of the QtCore module of the Qt Toolkit.
7 **
8 ** $QT_BEGIN_LICENSE:LGPL$
9 ** GNU Lesser General Public License Usage
10 ** This file may be used under the terms of the GNU Lesser General Public
11 ** License version 2.1 as published by the Free Software Foundation and
12 ** appearing in the file LICENSE.LGPL included in the packaging of this
13 ** file. Please review the following information to ensure the GNU Lesser
14 ** General Public License version 2.1 requirements will be met:
15 ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
16 **
17 ** In addition, as a special exception, Nokia gives you certain additional
18 ** rights. These rights are described in the Nokia Qt LGPL Exception
19 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
20 **
21 ** GNU General Public License Usage
22 ** Alternatively, this file may be used under the terms of the GNU General
23 ** Public License version 3.0 as published by the Free Software Foundation
24 ** and appearing in the file LICENSE.GPL included in the packaging of this
25 ** file. Please review the following information to ensure the GNU General
26 ** Public License version 3.0 requirements will be met:
27 ** http://www.gnu.org/copyleft/gpl.html.
28 **
29 ** Other Usage
30 ** Alternatively, this file may be used in accordance with the terms and
31 ** conditions contained in a signed written agreement between you and Nokia.
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 disappears.
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 operator==(const QScopedPointer<T, Cleanup> &lhs, const QScopedPointer<T, Cleanup> &rhs)
178
179     Equality operator. Returns true if the scoped pointers
180     \a lhs and \a rhs are pointing to the same object.
181     Otherwise returns false.
182 */
183
184
185 /*!
186     \fn bool operator!=(const QScopedPointer<T, Cleanup> &lhs, const QScopedPointer<T, Cleanup> &rhs)
187
188     Inequality operator. Returns true if the scoped pointers
189     \a lhs and \a rhs are \e not pointing to the same object.
190     Otherwise returns false.
191 */
192
193 /*!
194     \fn bool QScopedPointer::isNull() const
195
196     Returns \c true if this object is holding a pointer that is \c null.
197 */
198
199 /*!
200     \fn void QScopedPointer::reset(T *other = 0)
201
202     Deletes the existing object it is pointing to if any, and sets its pointer to
203     \a other. QScopedPointer now owns \a other and will delete it in its
204     destructor.
205 */
206
207 /*!
208     \fn T *QScopedPointer::take()
209
210     Returns the value of the pointer referenced by this object. The pointer of this
211     QScopedPointer object will be reset to \c null.
212
213     Callers of this function take ownership of the pointer.
214 */
215
216 /*! \fn bool QScopedPointer::operator!() const
217
218     Returns \c true if the pointer referenced by this object is \c null, otherwise
219     returns \c false.
220
221     \sa isNull()
222 */
223
224 /*! \fn void QScopedPointer::swap(QScopedPointer<T, Cleanup> &other)
225   Swap this pointer with \a other.
226  */
227
228 /*!
229   \class QScopedArrayPointer
230
231   \brief The QScopedArrayPointer class stores a pointer to a
232   dynamically allocated array of objects, and deletes it upon
233   destruction.
234
235   \since 4.6
236   \reentrant
237   \ingroup misc
238
239   A QScopedArrayPointer is a QScopedPointer that defaults to
240   deleting the object it is pointing to with the delete[] operator. It
241   also features operator[] for convenience, so we can write:
242
243   \code
244     void foo()
245     {
246         QScopedArrayPointer<int> i(new int[10]);
247         i[2] = 42;
248         ...
249         return; // our integer array is now deleted using delete[]
250     }
251   \endcode
252 */
253
254 /*!
255     \fn QScopedArrayPointer::QScopedArrayPointer()
256
257     Constructs a QScopedArrayPointer instance.
258 */
259
260 /*!
261     \fn T *QScopedArrayPointer::operator[](int i)
262
263     Provides access to entry \a i of the scoped pointer's array of
264     objects.
265
266     If the contained pointer is \c null, behavior is undefined.
267
268     \sa isNull()
269 */
270
271 /*!
272     \fn T *QScopedArrayPointer::operator[](int i) const
273
274     Provides access to entry \a i of the scoped pointer's array of
275     objects.
276
277     If the contained pointer is \c null, behavior is undefined.
278
279     \sa isNull()
280 */
281
282 QT_END_NAMESPACE