Skip to content

Commit 07b6bd1

Browse files
Clean up and complete <new> header
This makes this header complete up to including C++14, except two exception classes that cannot be defined without `<exception>`. The functions related to the "new_handler" are declared but not actually defined, to prevent overhead and complexity. They are still declared to allow implementing them in user code if needed. This makes the implementation of all operator new and delete functions comply with the C++11/C++14 specification in terms of which should be actually implemented and which should be delegate to other functions. There are still some areas where these implementations are not entirely standards-compliant, which will be fixed in subsequent commits. This fixes part of arduino#287 and fixes arduino#47.
1 parent 9a02bd8 commit 07b6bd1

File tree

2 files changed

+79
-13
lines changed

2 files changed

+79
-13
lines changed

Diff for: cores/arduino/new

+32-3
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,40 @@
2121

2222
#include <stdlib.h>
2323

24+
namespace std {
25+
struct nothrow_t {};
26+
extern const nothrow_t nothrow;
27+
28+
// These are not actually implemented, to prevent overhead and
29+
// complexity. They are still declared to allow implementing
30+
// them in user code if needed.
31+
typedef void (*new_handler)();
32+
new_handler set_new_handler(new_handler new_p) noexcept;
33+
new_handler get_new_handler() noexcept;
34+
} // namespace std
35+
2436
void * operator new(size_t size);
2537
void * operator new[](size_t size);
26-
void * operator new(size_t size, void * ptr) noexcept;
27-
void operator delete(void * ptr);
28-
void operator delete[](void * ptr);
38+
39+
void * operator new(size_t size, const std::nothrow_t tag) noexcept;
40+
void * operator new[](size_t size, const std::nothrow_t& tag) noexcept;
41+
42+
void * operator new(size_t size, void *place) noexcept;
43+
void * operator new[](size_t size, void *place) noexcept;
44+
45+
void operator delete(void * ptr) noexcept;
46+
void operator delete[](void * ptr) noexcept;
47+
48+
#if __cplusplus >= 201402L
49+
void operator delete(void* ptr, size_t size) noexcept;
50+
void operator delete[](void * ptr, size_t size) noexcept;
51+
#endif // __cplusplus >= 201402L
52+
53+
void operator delete(void* ptr, const std::nothrow_t& tag) noexcept;
54+
void operator delete[](void* ptr, const std::nothrow_t& tag) noexcept;
55+
56+
void operator delete(void* ptr, void* place) noexcept;
57+
void operator delete[](void* ptr, void* place) noexcept;
2958

3059
#endif
3160

Diff for: cores/arduino/new.cpp

+47-10
Original file line numberDiff line numberDiff line change
@@ -16,26 +16,63 @@
1616
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
1717
*/
1818

19-
#include <stdlib.h>
19+
#include "new.h"
2020

21-
void *operator new(size_t size) {
22-
return malloc(size);
21+
namespace std {
22+
const nothrow_t nothrow;
2323
}
2424

25-
void *operator new[](size_t size) {
25+
void * operator new(size_t size) {
2626
return malloc(size);
2727
}
28+
void * operator new[](size_t size) {
29+
return operator new(size);
30+
}
2831

29-
void * operator new(size_t size, void * ptr) noexcept {
30-
(void)size;
31-
return ptr;
32+
void * operator new(size_t size, const std::nothrow_t tag) noexcept {
33+
return operator new(size);
34+
}
35+
void * operator new[](size_t size, const std::nothrow_t& tag) noexcept {
36+
return operator new[](size);
3237
}
3338

34-
void operator delete(void * ptr) {
35-
free(ptr);
39+
void * operator new(size_t size, void *place) noexcept {
40+
// Nothing to do
41+
(void)size; // unused
42+
return place;
43+
}
44+
void * operator new[](size_t size, void *place) noexcept {
45+
return operator new(size, place);
3646
}
3747

38-
void operator delete[](void * ptr) {
48+
void operator delete(void * ptr) noexcept {
3949
free(ptr);
4050
}
51+
void operator delete[](void * ptr) noexcept {
52+
operator delete(ptr);
53+
}
54+
55+
#if __cplusplus >= 201402L
56+
void operator delete(void* ptr, size_t size) noexcept {
57+
operator delete(ptr);
58+
}
59+
void operator delete[](void * ptr, size_t size) noexcept {
60+
operator delete[](ptr);
61+
}
62+
#endif // __cplusplus >= 201402L
4163

64+
void operator delete(void* ptr, const std::nothrow_t& tag) noexcept {
65+
operator delete(ptr);
66+
}
67+
void operator delete[](void* ptr, const std::nothrow_t& tag) noexcept {
68+
operator delete[](ptr);
69+
}
70+
71+
void operator delete(void* ptr, void* place) noexcept {
72+
(void)ptr; (void)place; // unused
73+
// Nothing to do
74+
}
75+
void operator delete[](void* ptr, void* place) noexcept {
76+
(void)ptr; (void)place; // unused
77+
// Nothing to do
78+
}

0 commit comments

Comments
 (0)