VirtualBox

source: vbox/trunk/src/VBox/Runtime/r3/alloc-ef-cpp.cpp

Last change on this file was 106061, checked in by vboxsync, 2 months ago

Copyright year updates by scm.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id Revision
File size: 5.3 KB
Line 
1/* $Id: alloc-ef-cpp.cpp 106061 2024-09-16 14:03:52Z vboxsync $ */
2/** @file
3 * IPRT - Memory Allocation, C++ electric fence.
4 */
5
6/*
7 * Copyright (C) 2006-2024 Oracle and/or its affiliates.
8 *
9 * This file is part of VirtualBox base platform packages, as
10 * available from https://www.virtualbox.org.
11 *
12 * This program is free software; you can redistribute it and/or
13 * modify it under the terms of the GNU General Public License
14 * as published by the Free Software Foundation, in version 3 of the
15 * License.
16 *
17 * This program is distributed in the hope that it will be useful, but
18 * WITHOUT ANY WARRANTY; without even the implied warranty of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
20 * General Public License for more details.
21 *
22 * You should have received a copy of the GNU General Public License
23 * along with this program; if not, see <https://www.gnu.org/licenses>.
24 *
25 * The contents of this file may alternatively be used under the terms
26 * of the Common Development and Distribution License Version 1.0
27 * (CDDL), a copy of it is provided in the "COPYING.CDDL" file included
28 * in the VirtualBox distribution, in which case the provisions of the
29 * CDDL are applicable instead of those of the GPL.
30 *
31 * You may elect to license modified versions of this file under the
32 * terms and conditions of either the GPL or the CDDL or both.
33 *
34 * SPDX-License-Identifier: GPL-3.0-only OR CDDL-1.0
35 */
36
37
38/*********************************************************************************************************************************
39* Header Files *
40*********************************************************************************************************************************/
41#include "alloc-ef.h"
42
43#include <iprt/asm.h>
44#include <new>
45
46
47/*********************************************************************************************************************************
48* Defined Constants And Macros *
49*********************************************************************************************************************************/
50/** @todo test this on MSC */
51
52/** MSC declares the operators as cdecl it seems. */
53#ifdef _MSC_VER
54# define RT_EF_CDECL __cdecl
55#else
56# define RT_EF_CDECL
57#endif
58
59/** MSC doesn't use the standard namespace. */
60#ifdef _MSC_VER
61# define RT_EF_SIZE_T size_t
62#else
63# define RT_EF_SIZE_T std::size_t
64#endif
65
66/** The hint that we're throwing std::bad_alloc is not apprecitated by MSC. */
67#ifdef RT_EXCEPTIONS_ENABLED
68# ifdef _MSC_VER
69# define RT_EF_THROWS_BAD_ALLOC
70# define RT_EF_NOTHROW RT_NO_THROW_DEF
71# else
72# ifdef _GLIBCXX_THROW
73# define RT_EF_THROWS_BAD_ALLOC _GLIBCXX_THROW(std::bad_alloc)
74# elif defined(__cplusplus) && (__cplusplus + 0) < 201700
75# define RT_EF_THROWS_BAD_ALLOC throw(std::bad_alloc)
76# else
77# define RT_EF_THROWS_BAD_ALLOC noexcept(false)
78# endif
79# define RT_EF_NOTHROW throw()
80# endif
81#else /* !RT_EXCEPTIONS_ENABLED */
82# define RT_EF_THROWS_BAD_ALLOC
83# define RT_EF_NOTHROW
84#endif /* !RT_EXCEPTIONS_ENABLED */
85
86
87void *RT_EF_CDECL operator new(RT_EF_SIZE_T cb) RT_EF_THROWS_BAD_ALLOC
88{
89 void *pv = rtR3MemAlloc("new", RTMEMTYPE_NEW, cb, cb, NULL, ASMReturnAddress(), NULL, 0, NULL);
90 if (!pv)
91 throw std::bad_alloc();
92 return pv;
93}
94
95
96void *RT_EF_CDECL operator new(RT_EF_SIZE_T cb, const std::nothrow_t &) RT_EF_NOTHROW
97{
98 void *pv = rtR3MemAlloc("new nothrow", RTMEMTYPE_NEW, cb, cb, NULL, ASMReturnAddress(), NULL, 0, NULL);
99 return pv;
100}
101
102
103void RT_EF_CDECL operator delete(void *pv) RT_EF_NOTHROW
104{
105 rtR3MemFree("delete", RTMEMTYPE_DELETE, pv, 0, ASMReturnAddress(), NULL, 0, NULL);
106}
107
108
109#ifdef __cpp_sized_deallocation
110void RT_EF_CDECL operator delete(void *pv, RT_EF_SIZE_T cb) RT_EF_NOTHROW
111{
112 NOREF(cb);
113 AssertMsgFailed(("cb ignored!\n"));
114 rtR3MemFree("delete", RTMEMTYPE_DELETE, pv, 0, ASMReturnAddress(), NULL, 0, NULL);
115}
116#endif
117
118
119void RT_EF_CDECL operator delete(void * pv, const std::nothrow_t &) RT_EF_NOTHROW
120{
121 rtR3MemFree("delete nothrow", RTMEMTYPE_DELETE, pv, 0, ASMReturnAddress(), NULL, 0, NULL);
122}
123
124
125/*
126 *
127 * Array object form.
128 * Array object form.
129 * Array object form.
130 *
131 */
132
133void *RT_EF_CDECL operator new[](RT_EF_SIZE_T cb) RT_EF_THROWS_BAD_ALLOC
134{
135 void *pv = rtR3MemAlloc("new[]", RTMEMTYPE_NEW_ARRAY, cb, cb, NULL, ASMReturnAddress(), NULL, 0, NULL);
136 if (!pv)
137 throw std::bad_alloc();
138 return pv;
139}
140
141
142void * RT_EF_CDECL operator new[](RT_EF_SIZE_T cb, const std::nothrow_t &) RT_EF_NOTHROW
143{
144 void *pv = rtR3MemAlloc("new[] nothrow", RTMEMTYPE_NEW_ARRAY, cb, cb, NULL, ASMReturnAddress(), NULL, 0, NULL);
145 return pv;
146}
147
148
149void RT_EF_CDECL operator delete[](void * pv) RT_EF_NOTHROW
150{
151 rtR3MemFree("delete[]", RTMEMTYPE_DELETE_ARRAY, pv, 0, ASMReturnAddress(), NULL, 0, NULL);
152}
153
154
155#ifdef __cpp_sized_deallocation
156void RT_EF_CDECL operator delete[](void * pv, RT_EF_SIZE_T cb) RT_EF_NOTHROW
157{
158 NOREF(cb);
159 AssertMsgFailed(("cb ignored!\n"));
160 rtR3MemFree("delete[]", RTMEMTYPE_DELETE_ARRAY, pv, 0, ASMReturnAddress(), NULL, 0, NULL);
161}
162#endif
163
164
165void RT_EF_CDECL operator delete[](void *pv, const std::nothrow_t &) RT_EF_NOTHROW
166{
167 rtR3MemFree("delete[] nothrow", RTMEMTYPE_DELETE_ARRAY, pv, 0, ASMReturnAddress(), NULL, 0, NULL);
168}
169
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette