29 KiB
29 KiB
<html lang="en">
<head>
</head>
</html>
LCOV - code coverage report | ||||||||||||||||||||||
![]() | ||||||||||||||||||||||
|
||||||||||||||||||||||
![]() |
Line data Source code 1 : // The -*- C++ -*- dynamic memory management header. 2 : 3 : // Copyright (C) 1994-2023 Free Software Foundation, Inc. 4 : 5 : // This file is part of GCC. 6 : // 7 : // GCC is free software; you can redistribute it and/or modify 8 : // it under the terms of the GNU General Public License as published by 9 : // the Free Software Foundation; either version 3, or (at your option) 10 : // any later version. 11 : // 12 : // GCC is distributed in the hope that it will be useful, 13 : // but WITHOUT ANY WARRANTY; without even the implied warranty of 14 : // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 : // GNU General Public License for more details. 16 : // 17 : // Under Section 7 of GPL version 3, you are granted additional 18 : // permissions described in the GCC Runtime Library Exception, version 19 : // 3.1, as published by the Free Software Foundation. 20 : 21 : // You should have received a copy of the GNU General Public License and 22 : // a copy of the GCC Runtime Library Exception along with this program; 23 : // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see 24 : // <http://www.gnu.org/licenses/>. 25 : 26 : /** @file new 27 : * This is a Standard C++ Library header. 28 : * 29 : * The header @c new defines several functions to manage dynamic memory and 30 : * handling memory allocation errors; see 31 : * https://gcc.gnu.org/onlinedocs/libstdc++/manual/dynamic_memory.html 32 : * for more. 33 : */ 34 : 35 : #ifndef _NEW 36 : #define _NEW 37 : 38 : #pragma GCC system_header 39 : 40 : #include <bits/c++config.h> 41 : #include <bits/exception.h> 42 : 43 : #pragma GCC visibility push(default) 44 : 45 : extern "C++" { 46 : 47 : namespace std 48 : { 49 : /** 50 : * @brief Exception possibly thrown by @c new. 51 : * @ingroup exceptions 52 : * 53 : * @c bad_alloc (or classes derived from it) is used to report allocation 54 : * errors from the throwing forms of @c new. */ 55 : class bad_alloc : public exception 56 : { 57 : public: 58 : bad_alloc() throw() { } 59 : 60 : #if __cplusplus >= 201103L 61 : bad_alloc(const bad_alloc&) = default; 62 : bad_alloc& operator=(const bad_alloc&) = default; 63 : #endif 64 : 65 : // This declaration is not useless: 66 : // http://gcc.gnu.org/onlinedocs/gcc-3.0.2/gcc_6.html#SEC118 67 : virtual ~bad_alloc() throw(); 68 : 69 : // See comment in eh_exception.cc. 70 : virtual const char* what() const throw(); 71 : }; 72 : 73 : #if __cplusplus >= 201103L 74 : class bad_array_new_length : public bad_alloc 75 : { 76 : public: 77 : bad_array_new_length() throw() { } 78 : 79 : // This declaration is not useless: 80 : // http://gcc.gnu.org/onlinedocs/gcc-3.0.2/gcc_6.html#SEC118 81 : virtual ~bad_array_new_length() throw(); 82 : 83 : // See comment in eh_exception.cc. 84 : virtual const char* what() const throw(); 85 : }; 86 : #endif 87 : 88 : #if __cpp_aligned_new 89 : enum class align_val_t: size_t {}; 90 : #endif 91 : 92 : struct nothrow_t 93 : { 94 : #if __cplusplus >= 201103L 95 : explicit nothrow_t() = default; 96 : #endif 97 : }; 98 : 99 : extern const nothrow_t nothrow; 100 : 101 : /** If you write your own error handler to be called by @c new, it must 102 : * be of this type. */ 103 : typedef void (*new_handler)(); 104 : 105 : /// Takes a replacement handler as the argument, returns the 106 : /// previous handler. 107 : new_handler set_new_handler(new_handler) throw(); 108 : 109 : #if __cplusplus >= 201103L 110 : /// Return the current new handler. 111 : new_handler get_new_handler() noexcept; 112 : #endif 113 : } // namespace std 114 : 115 : //@{ 116 : /** These are replaceable signatures: 117 : * - normal single new and delete (no arguments, throw @c bad_alloc on error) 118 : * - normal array new and delete (same) 119 : * - @c nothrow single new and delete (take a @c nothrow argument, return 120 : * @c NULL on error) 121 : * - @c nothrow array new and delete (same) 122 : * 123 : * Placement new and delete signatures (take a memory address argument, 124 : * does nothing) may not be replaced by a user's program. 125 : */ 126 : _GLIBCXX_NODISCARD void* operator new(std::size_t) _GLIBCXX_THROW (std::bad_alloc) 127 : __attribute__((__externally_visible__)); 128 : _GLIBCXX_NODISCARD void* operator new[](std::size_t) _GLIBCXX_THROW (std::bad_alloc) 129 : __attribute__((__externally_visible__)); 130 : void operator delete(void*) _GLIBCXX_USE_NOEXCEPT 131 : __attribute__((__externally_visible__)); 132 : void operator delete[](void*) _GLIBCXX_USE_NOEXCEPT 133 : __attribute__((__externally_visible__)); 134 : #if __cpp_sized_deallocation 135 : void operator delete(void*, std::size_t) _GLIBCXX_USE_NOEXCEPT 136 : __attribute__((__externally_visible__)); 137 : void operator delete[](void*, std::size_t) _GLIBCXX_USE_NOEXCEPT 138 : __attribute__((__externally_visible__)); 139 : #endif 140 : _GLIBCXX_NODISCARD void* operator new(std::size_t, const std::nothrow_t&) _GLIBCXX_USE_NOEXCEPT 141 : __attribute__((__externally_visible__, __alloc_size__ (1), __malloc__)); 142 : _GLIBCXX_NODISCARD void* operator new[](std::size_t, const std::nothrow_t&) _GLIBCXX_USE_NOEXCEPT 143 : __attribute__((__externally_visible__, __alloc_size__ (1), __malloc__)); 144 : void operator delete(void*, const std::nothrow_t&) _GLIBCXX_USE_NOEXCEPT 145 : __attribute__((__externally_visible__)); 146 : void operator delete[](void*, const std::nothrow_t&) _GLIBCXX_USE_NOEXCEPT 147 : __attribute__((__externally_visible__)); 148 : #if __cpp_aligned_new 149 : _GLIBCXX_NODISCARD void* operator new(std::size_t, std::align_val_t) 150 : __attribute__((__externally_visible__, __alloc_size__ (1), __malloc__)); 151 : _GLIBCXX_NODISCARD void* operator new(std::size_t, std::align_val_t, const std::nothrow_t&) 152 : _GLIBCXX_USE_NOEXCEPT __attribute__((__externally_visible__, __alloc_size__ (1), __malloc__)); 153 : void operator delete(void*, std::align_val_t) 154 : _GLIBCXX_USE_NOEXCEPT __attribute__((__externally_visible__)); 155 : void operator delete(void*, std::align_val_t, const std::nothrow_t&) 156 : _GLIBCXX_USE_NOEXCEPT __attribute__((__externally_visible__)); 157 : _GLIBCXX_NODISCARD void* operator new[](std::size_t, std::align_val_t) 158 : __attribute__((__externally_visible__, __alloc_size__ (1), __malloc__)); 159 : _GLIBCXX_NODISCARD void* operator new[](std::size_t, std::align_val_t, const std::nothrow_t&) 160 : _GLIBCXX_USE_NOEXCEPT __attribute__((__externally_visible__, __alloc_size__ (1), __malloc__)); 161 : void operator delete[](void*, std::align_val_t) 162 : _GLIBCXX_USE_NOEXCEPT __attribute__((__externally_visible__)); 163 : void operator delete[](void*, std::align_val_t, const std::nothrow_t&) 164 : _GLIBCXX_USE_NOEXCEPT __attribute__((__externally_visible__)); 165 : #if __cpp_sized_deallocation 166 : void operator delete(void*, std::size_t, std::align_val_t) 167 : _GLIBCXX_USE_NOEXCEPT __attribute__((__externally_visible__)); 168 : void operator delete[](void*, std::size_t, std::align_val_t) 169 : _GLIBCXX_USE_NOEXCEPT __attribute__((__externally_visible__)); 170 : #endif // __cpp_sized_deallocation 171 : #endif // __cpp_aligned_new 172 : 173 : // Default placement versions of operator new. 174 1073305006 : _GLIBCXX_NODISCARD inline void* operator new(std::size_t, void* __p) _GLIBCXX_USE_NOEXCEPT 175 1073305006 : { return __p; } 176 : _GLIBCXX_NODISCARD inline void* operator new[](std::size_t, void* __p) _GLIBCXX_USE_NOEXCEPT 177 : { return __p; } 178 : 179 : // Default placement versions of operator delete. 180 0 : inline void operator delete (void*, void*) _GLIBCXX_USE_NOEXCEPT { } 181 : inline void operator delete[](void*, void*) _GLIBCXX_USE_NOEXCEPT { } 182 : //@} 183 : } // extern "C++" 184 : 185 : #if __cplusplus >= 201703L 186 : namespace std 187 : { 188 : #ifdef _GLIBCXX_HAVE_BUILTIN_LAUNDER 189 : #define __cpp_lib_launder 201606L 190 : /// Pointer optimization barrier [ptr.launder] 191 : template<typename _Tp> 192 : [[nodiscard]] constexpr _Tp* 193 : launder(_Tp* __p) noexcept 194 : { return __builtin_launder(__p); } 195 : 196 : // The program is ill-formed if T is a function type or 197 : // (possibly cv-qualified) void. 198 : 199 : template<typename _Ret, typename... _Args _GLIBCXX_NOEXCEPT_PARM> 200 : void launder(_Ret (*)(_Args...) _GLIBCXX_NOEXCEPT_QUAL) = delete; 201 : template<typename _Ret, typename... _Args _GLIBCXX_NOEXCEPT_PARM> 202 : void launder(_Ret (*)(_Args......) _GLIBCXX_NOEXCEPT_QUAL) = delete; 203 : 204 : void launder(void*) = delete; 205 : void launder(const void*) = delete; 206 : void launder(volatile void*) = delete; 207 : void launder(const volatile void*) = delete; 208 : #endif // _GLIBCXX_HAVE_BUILTIN_LAUNDER 209 : 210 : #ifdef __GCC_DESTRUCTIVE_SIZE 211 : # define __cpp_lib_hardware_interference_size 201703L 212 : inline constexpr size_t hardware_destructive_interference_size = __GCC_DESTRUCTIVE_SIZE; 213 : inline constexpr size_t hardware_constructive_interference_size = __GCC_CONSTRUCTIVE_SIZE; 214 : #endif // __GCC_DESTRUCTIVE_SIZE 215 : } 216 : #endif // C++17 217 : 218 : #if __cplusplus > 201703L 219 : namespace std 220 : { 221 : /// Tag type used to declare a class-specific operator delete that can 222 : /// invoke the destructor before deallocating the memory. 223 : struct destroying_delete_t 224 : { 225 : explicit destroying_delete_t() = default; 226 : }; 227 : /// Tag variable of type destroying_delete_t. 228 : inline constexpr destroying_delete_t destroying_delete{}; 229 : } 230 : // Only define the feature test macro if the compiler supports the feature: 231 : #if __cpp_impl_destroying_delete 232 : # define __cpp_lib_destroying_delete 201806L 233 : #endif 234 : #endif // C++20 235 : 236 : #pragma GCC visibility pop 237 : 238 : #endif |
![]() |
Generated by: LCOV version 2.0-1 |
</html>