2 Permission is granted to use, modify, and / or redistribute at will.
4 This includes removing authorship notices, re-use of code parts in
5 other software (with or without giving credit), and / or creating a
6 commercial product based on it.
8 This permission is not revocable by the author.
10 This software is provided as-is. Use it at your own risk. There is
11 no warranty whatsoever, neither expressed nor implied, and by using
12 this software you accept that the author(s) shall not be held liable
13 for any loss of data, loss of service, or other damages, be they
14 incidental or consequential. Your only option other than accepting
15 this is not to use the software at all.
17 #ifndef _LIGHTLIBCPP_NEW_HPP
18 #define _LIGHTLIBCPP_NEW_HPP
22 #include <cstddef> // std::size_t
23 #include <exception> // std::exception
29 /* (Forward) declaration of std::bad_alloc */
34 /** \addtogroup lightlibcpp_18_5 */
39 * \brief Support structure for nothrow-new operator
41 * Support structure for the usage of the nothrow-new operator. This
42 * structure is intentionally empty.
45 * \brief Struktur zur Unterstützung des nothrow-new Operators
47 * Die Struktur ermöglicht das Benutzen des nothrow-new Operators und ist
56 * External instance of the nothrow_t structure.
59 * Externe Instanz der nothrow_t-Struktur.
61 extern const nothrow_t nothrow
;
67 /** \addtogroup lightlibcpp_18_5_2 */
72 * \brief Exception to report failure to allocate storage
74 * 18.5.2.1 Class bad_alloc
76 * The class bad_alloc defines the type of objects thrown as exceptions by
77 * the implementation to report a failure to allocate storage.
80 * \brief Ausnahme um Fehlschlag einer Speicherallokation anzuzeigen
82 * 18.5.2.1 Klasse bad_alloc
84 * Die Klasse bad_alloc definiert den Objekttyp, welcher als Ausnahme
85 * geworfen wird, um den Fehlschlag einer Speicherallokation anzuzeigen.
87 class bad_alloc
: public std::exception
92 * Constructs an object of class bad_alloc.
95 * Konstruiert ein Objekt der Klasse bad_alloc.
97 inline bad_alloc() throw()
103 * Copies an object of class bad_alloc.
104 * \param[in] x reference to the object to copy
107 * Kopiert ein Objekt der Klasse bad_alloc.
108 * \param[in] x Referenz auf das zu kopierende Objekt
110 inline bad_alloc(const bad_alloc
& x
) throw()
117 * Destructs an object of class bad_alloc
120 * Zerstört ein Objekt der Klasse bad_alloc
122 virtual ~bad_alloc() throw();
124 virtual const char* what() const throw();
129 * 18.5.2.2 Type new_handler
131 * The type of a handler function to be called by operator the new operators
132 * when they cannot satisfy a request for additional storage.
134 * Required behavior: A new_handler shall perform one of the following:
135 * - make more storage available for allocation and then return
136 * - throw an exception of type bad_alloc or a class derived from bad_alloc
137 * - call either abort() or exit()
140 * 18.5.2.2 Typ new_handler
142 * Der Typ einer Handlerfunktion die von den new-Operatoren aufgerufen wird,
143 * wenn dieser eine Speicherallokation nicht erfüllen kann. Der Handler
144 * muss eine der folgenden Bedinungen erfüllen:
145 * - mehr Speicher zur Verfügung stellen und zur aufrufenden Funktion
147 * - eine Ausnahme vom Typ bad_alloc oder einer davon abgeleiteten Klasse
149 * - entweder abort() oder exit() aufrufen
151 typedef void (*new_handler
)();
153 /** 18.5.2.3 set_new_handler
155 * Establishes the function designated by new_p as the current new_handler.
156 * \param[in] new_p the new new_handler
157 * \return 0 on the first call, the previous new_handler on subsequent
161 * Die Funktion new_p wird zum neuen Handler new_handler
162 * \param[in] new_p der neue new_handler
163 * \return 0 beim ersten Aufruf oder vorhergehender new_handler bei den
164 * darauf folgenden Aufrufen
166 new_handler
set_new_handler(new_handler new_p
) throw();
173 /** \addtogroup lightlibcpp_18_5_1 */
176 /* 18.5.1.1 Single-object forms */
180 * The allocation function called by a new-expression to allocate size bytes
181 * suitably aligned to represent any object of that size. If the allocation
182 * request cannot be satisfied bad_alloc is thrown (if
183 * _LIGHTLIBCPP_NO_EXCEPTIONS is not defined).
185 * The default behaviour is the following:
189 * 2. return the pointer to the allocated space if malloc succeeded
191 * 3. throw bad_alloc if no new_handler is installed
193 * 4. call the new_handler and go to 1
194 * \note A C++ program may define a function with this function signature that
195 * displaces the default version defined by the C++ Standard library,
196 * but the above behaviour is required.
197 * \param[in] size number of bytes to allocate
198 * \return a pointer to the allocated storage
201 * Die Allokationsfunktion, die von einem new-Ausdruck aufgerufen wird, um
202 * size Bytes mit dem richtigen Alignment für alle Objekte dieser Größe zu
203 * allozieren. Falls nicht genügend Speicher vorhanden ist, wird eine
204 * Ausnahme vom Typ bad_alloc geworfen (falls _LIGHTLIBCPP_NO_EXCEPTIONS
205 * nicht definiert ist).
207 * Das Standardverhalten ist:
209 * 1. Aufrufen von malloc
211 * 2. den Zeiger auf den allozierten Speicherplatz zurückgeben, falls der
212 * malloc-Aufruf erfolgreich war
214 * 3. eine Ausnahme vom Typ bad_alloc werfen, falls kein new_handler
217 * 4. den momentan installierten new_handler aufrufen und zu 1 zurückgehen
218 * \note Ein C++ Programm darf eine Funktion mit dieser Funktionssignatur,
219 * die die Funktion mit dem Standardverhalten aus der C++
220 * Standardbibliothek ersetzt, definieren, aber das obige Verhalten ist
222 * \param[in] size Anzahl der Bytes die alloziert werden sollen
223 * \return ein Zeiger auf den allozierten Speicherplatz
226 void* operator new(std::size_t size
)
227 #ifndef _LIGHTLIBCPP_NO_EXCEPTIONS
228 throw(std::bad_alloc
);
235 * The allocation function called by a placement new-expression to allocate
236 * size bytes suitably aligned to represent any object of that size. If the
237 * allocation request cannot be satisfied 0 is returned.
239 * The default behaviour is the following:
243 * 2. return the pointer to the allocated space if malloc succeeded
245 * 3. return 0 if no new_handler is installed
247 * 4. call the new_handler and go to 1
248 * \note A C++ program may define a function with this function signature that
249 * displaces the default version defined by the C++ Standard library,
250 * but the above behaviour is required.
251 * \param[in] size number of bytes to allocate
252 * \return a pointer to the allocated storage or 0
255 * Die Allokationsfunktion, die von einem placement-new-Ausdruck aufgerufen
256 * wird, um size Bytes mit dem richtigen Alignment für alle Objekte dieser
257 * Größe zu allozieren. Falls nicht genügend Speicher vorhanden ist, wird 0
260 * Das Standardverhalten ist:
262 * 1. Aufrufen von malloc
264 * 2. den Zeiger auf den allozierten Speicherplatz zurückgeben, falls der
265 * malloc-Aufruf erfolgreich war
267 * 3. 0 zurückgeben, falls kein new_handler installiert ist
269 * 4. den momentan installierten new_handler aufrufen und zu 1 zurückgehen
270 * \note Ein C++ Programm darf eine Funktion mit dieser Funktionssignatur,
271 * die die Funktion mit dem Standardverhalten aus der C++
272 * Standardbibliothek ersetzt, definieren, aber das obige Verhalten ist
274 * \param[in] size Anzahl der Bytes die alloziert werden sollen
275 * \return ein Zeiger auf den allozierten Speicherplatz oder 0
278 void* operator new(std::size_t size
,
279 const std::nothrow_t
&) throw();
283 * The deallocation function called by a delete-expression to free the memory
284 * at the address ptr points to. If ptr is 0, nothing is done.
286 * ptr must have been allocated with
288 * * operator new(std::size_t) or with
290 * * operator new(std::size_t, const std::nothrow_t&)
291 * \note A C++ program may define a function with this function signature that
292 * displaces the default version defined by the C++ Standard library,
293 * but the above behaviour is required.
294 * \param[in] ptr the address of the memory supposed to be deallocated
297 * Die Deallokationsfunktion, welche von einem delete-Ausdruck aufgerufen
298 * wird, um den Speicher an der Adresse auf die ptr zeigt freizugeben. Falls
299 * ptr 0 ist, wird nichts getan.
303 * * operator new(std::size_t) oder mit
305 * * operator new(std::size_t, const std::nothrow_t&)
307 * alloziert worden sein.
308 * \note Ein C++ Programm darf eine Funktion mit dieser Funktionssignatur,
309 * die die Funktion mit dem Standardverhalten aus der C++
310 * Standardbibliothek ersetzt, definieren, aber das obige Verhalten ist
312 * \param[in] ptr die Adresse des zu deallozierenden Speichers
315 void operator delete(void* ptr
) throw();
319 * The deallocation function called by a placement delete-expression to free
320 * the memory at the address ptr points to. If ptr is 0, nothing is done.
322 * ptr must have been allocated with
324 * * operator new(std::size_t) or with
326 * * operator new(std::size_t, const std::nothrow_t&)
327 * \note A C++ program may define a function with this function signature that
328 * displaces the default version defined by the C++ Standard library,
329 * but the above behaviour is required.
330 * \param[in] ptr the address of the memory supposed to be deallocated
333 * Die Deallokationsfunktion, welche von einem placement-delete-Ausdruck
334 * aufgerufen wird, um den Speicher an der Adresse auf die ptr zeigt
335 * freizugeben. Falls ptr 0 ist, wird nichts getan.
339 * * operator new(std::size_t) oder mit
341 * * operator new(std::size_t, const std::nothrow_t&)
343 * alloziert worden sein.
344 * \note Ein C++ Programm darf eine Funktion mit dieser Funktionssignatur,
345 * die die Funktion mit dem Standardverhalten aus der C++
346 * Standardbibliothek ersetzt, definieren, aber das obige Verhalten ist
348 * \param[in] ptr die Adresse des zu deallozierenden Speichers
351 void operator delete(void* ptr
,
352 const std::nothrow_t
&) throw();
356 /* 18.5.1.2 Array forms */
360 * The allocation function called by the array form of a new-expression to
361 * allocate size bytes suitably aligned to represent any object of that size.
362 * If the allocation request cannot be satisfied bad_alloc is thrown (if
363 * _LIGHTLIBCPP_NO_EXCEPTIONS is not defined).
365 * default behaviour: return operator new(size)
366 * \note A C++ program may define a function with this function signature that
367 * displaces the default version defined by the C++ Standard library,
368 * but the above behaviour is required.
369 * \param[in] size number of bytes to allocate
370 * \return a pointer to the allocated storage
373 * Die Allokationsfunktion, die von der Array-Version des new-Ausdruck
374 * aufgerufen wird, um size Bytes mit dem richtigen Alignment für alle Objekte
375 * dieser Größe zu allozieren. Falls nicht genügend Speicher vorhanden ist,
376 * wird eine Ausnahme vom Typ bad_alloc geworfen (falls
377 * _LIGHTLIBCPP_NO_EXCEPTIONS nicht definiert ist).
379 * Das Standardverhalten ist: return operator new(size)
380 * \note Ein C++ Programm darf eine Funktion mit dieser Funktionssignatur,
381 * die die Funktion mit dem Standardverhalten aus der C++
382 * Standardbibliothek ersetzt, definieren, aber das obige Verhalten ist
384 * \param[in] size Anzahl der Bytes, die alloziert werden sollen
385 * \return ein Zeiger auf den allozierten Speicherplatz
388 void* operator new[](std::size_t size
)
389 #ifndef _LIGHTLIBCPP_NO_EXCEPTIONS
390 throw(std::bad_alloc
);
397 * The allocation function called by the array-version of a placement
398 * new-expression to allocate size bytes suitably aligned to represent any
399 * object of that size. If the allocation request cannot be satisfied 0 is
402 * The default behaviour is operator new (size, std::nothrow)
403 * \note A C++ program may define a function with this function signature that
404 * displaces the default version defined by the C++ Standard library,
405 * but the above behaviour is required.
406 * \param[in] size number of bytes to allocate
407 * \return a pointer to the allocated storage or 0
410 * Die Allokationsfunktion, die von der Array-Version eines
411 * placement-new-Ausdruck aufgerufen wird, um size Bytes mit dem richtigen
412 * Alignment für alle Objekte dieser Größe zu allozieren. Falls nicht genügend
413 * Speicher vorhanden ist, wird 0 zurückgegeben.
415 * Das Standardverhalten ist: return operator new(size, std::nothrow)
416 * \note Ein C++ Programm darf eine Funktion mit dieser Funktionssignatur,
417 * die die Funktion mit dem Standardverhalten aus der C++
418 * Standardbibliothek ersetzt, definieren, aber das obige Verhalten ist
420 * \param[in] size Anzahl der Bytes die alloziert werden sollen
421 * \return ein Zeiger auf den allozierten Speicherplatz oder 0
424 void* operator new[](std::size_t size
,
425 const std::nothrow_t
&) throw();
429 * The deallocation function called by the array-verion of a delete-expression
430 * to free the memory at the address ptr points to. If ptr is 0, nothing is
433 * ptr must have been allocated with
435 * * operator new[](std::size_t) or with
437 * * operator new[](std::size_t, const std::nothrow_t&)
438 * \note A C++ program may define a function with this function signature that
439 * displaces the default version defined by the C++ Standard library,
440 * but the above behaviour is required.
441 * \param[in] ptr the address of the memory supposed to be deallocated
444 * Die Deallokationsfunktion, welche von der Array-Version eines
445 * delete-Ausdrucks aufgerufen wird, um den Speicher an der Adresse auf die
446 * ptr zeigt freizugeben. Falls ptr 0 ist, wird nichts getan.
450 * * operator new[](std::size_t) oder mit
452 * * operator new[](std::size_t, const std::nothrow_t&)
454 * alloziert worden sein.
455 * \note Ein C++ Programm darf eine Funktion mit dieser Funktionssignatur,
456 * die die Funktion mit dem Standardverhalten aus der C++
457 * Standardbibliothek ersetzt, definieren, aber das obige Verhalten ist
459 * \param[in] ptr die Adresse des zu deallozierenden Speichers
462 void operator delete[](void* ptr
) throw();
466 * The deallocation function called by the array-version of a placement
467 * delete-expression to free the memory at the address ptr points to. If ptr
468 * is 0, nothing is done.
470 * ptr must have been allocated with
472 * * operator new[](std::size_t) or with
474 * * operator new[](std::size_t, const std::nothrow_t&)
475 * \note A C++ program may define a function with this function signature that
476 * displaces the default version defined by the C++ Standard library,
477 * but the above behaviour is required.
478 * \param[in] ptr the address of the memory supposed to be deallocated
481 * Die Deallokationsfunktion, welche von der Array-Version eines
482 * placement-delete-Ausdrucks aufgerufen wird, um den Speicher an der Adresse
483 * auf die ptr zeigt freizugeben. Falls ptr 0 ist, wird nichts getan.
487 * * operator new[](std::size_t) oder mit
489 * * operator new[](std::size_t, const std::nothrow_t&)
491 * alloziert worden sein.
492 * \note Ein C++ Programm darf eine Funktion mit dieser Funktionssignatur,
493 * die die Funktion mit dem Standardverhalten aus der C++
494 * Standardbibliothek ersetzt, definieren, aber das obige Verhalten ist
496 * \param[in] ptr die Adresse des zu deallozierenden Speichers
499 void operator delete[](void* ptr
,
500 const std::nothrow_t
&) throw();
504 /* 18.5.1.3 Placement forms */
508 * Intentionally does nothing
509 * \param[in] ptr returned unchanged
511 * \note A C++ program may not define a function that displaces this function
512 * in the Standard C++ library.
515 * Tut absichtlich nichts
516 * \param[in] ptr wird unverändert zurückgegeben
518 * \note Ein C++ Programm darf keine Funktion definieren, welche diese
519 * Funktion der Standard C++ Bibliothek ersetzt.
521 void* operator new(std::size_t,
526 * Intentionally does nothing
527 * \param[in] ptr returned unchanged
529 * \note A C++ program may not define a function that displaces this function
530 * in the Standard C++ library.
533 * Tut absichtlich nichts
534 * \param[in] ptr wird unverändert zurückgegeben
536 * \note Ein C++ Programm darf keine Funktion definieren, welche diese
537 * Funktion der Standard C++ Bibliothek ersetzt.
539 void* operator new[](std::size_t,
544 * Intentionally does nothing
545 * \note A C++ program may not define a function that displaces this function
546 * in the Standard C++ library.
549 * Tut absichtlich nichts
550 * \note Ein C++ Programm darf keine Funktion definieren, welche diese
551 * Funktion der Standard C++ Bibliothek ersetzt.
553 void operator delete(void*,
558 * Intentionally does nothing
559 * \note A C++ program may not define a function that displaces this function
560 * in the Standard C++ library.
563 * Tut absichtlich nichts
564 * \note Ein C++ Programm darf keine Funktion definieren, welche diese
565 * Funktion der Standard C++ Bibliothek ersetzt.
567 void operator delete[](void*,