source: trunk/src/corelib/tools/qscopedpointer.cpp@ 788

Last change on this file since 788 was 769, checked in by Dmitry A. Kuminov, 15 years ago

trunk: Merged in qt 4.6.3 sources from branches/vendor/nokia/qt.

  • Property svn:eol-style set to native
File size: 8.7 KB
Line 
1/****************************************************************************
2**
3** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
4** All rights reserved.
5** Contact: Nokia Corporation ([email protected])
6**
7** This file is part of the QtCore module of the Qt Toolkit.
8**
9** $QT_BEGIN_LICENSE:LGPL$
10** Commercial Usage
11** Licensees holding valid Qt Commercial licenses may use this file in
12** accordance with the Qt Commercial License Agreement provided with the
13** Software or, alternatively, in accordance with the terms contained in
14** a written agreement between you and Nokia.
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** GNU General Public License Usage
29** Alternatively, this file may be used under the terms of the GNU
30** General Public License version 3.0 as published by the Free Software
31** Foundation and appearing in the file LICENSE.GPL included in the
32** packaging of this file. Please review the following information to
33** ensure the GNU General Public License version 3.0 requirements will be
34** met: http://www.gnu.org/copyleft/gpl.html.
35**
36** If you have questions regarding the use of this file, please contact
37** Nokia at [email protected].
38** $QT_END_LICENSE$
39**
40****************************************************************************/
41
42#include "qscopedpointer.h"
43
44QT_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(T *p = 0)
256
257 Constructs this QScopedArrayPointer instance and sets its pointer
258 to \a p.
259*/
260
261/*!
262 \fn T *QScopedArrayPointer::operator[](int i)
263
264 Provides access to entry \a i of the scoped pointer's array of
265 objects.
266
267 If the contained pointer is \c null, behavior is undefined.
268
269 \sa isNull()
270*/
271
272/*!
273 \fn T *QScopedArrayPointer::operator[](int i) const
274
275 Provides access to entry \a i of the scoped pointer's array of
276 objects.
277
278 If the contained pointer is \c null, behavior is undefined.
279
280 \sa isNull()
281*/
282
283QT_END_NAMESPACE
Note: See TracBrowser for help on using the repository browser.