SimpleKernel 1.17.0
Loading...
Searching...
No Matches
kstd_new.cpp
Go to the documentation of this file.
1
5#include <cstddef>
6#include <new>
7
8#include "sk_stdlib.h"
9
10void* operator new(size_t size) {
11 if (size == 0) {
12 size = 1;
13 }
14 return malloc(size);
15}
16
17void* operator new[](size_t size) {
18 if (size == 0) {
19 size = 1;
20 }
21 return malloc(size);
22}
23
24void* operator new(size_t size, size_t alignment) noexcept {
25 if (size == 0) {
26 size = 1;
27 }
28
29 // 确保对齐参数是 2 的幂
30 if (alignment == 0 || (alignment & (alignment - 1)) != 0) {
31 return nullptr;
32 }
33
34 // 如果对齐要求小于等于默认对齐,使用普通 malloc
35 if (alignment <= alignof(std::max_align_t)) {
36 return malloc(size);
37 }
38
39 return aligned_alloc(alignment, size);
40}
41
42void* operator new[](size_t size, size_t alignment) noexcept {
43 if (size == 0) {
44 size = 1;
45 }
46
47 // 确保对齐参数是 2 的幂
48 if (alignment == 0 || (alignment & (alignment - 1)) != 0) {
49 return nullptr;
50 }
51
52 // 如果对齐要求小于等于默认对齐,使用普通 malloc
53 if (alignment <= alignof(std::max_align_t)) {
54 return malloc(size);
55 }
56
57 return aligned_alloc(alignment, size);
58}
59
60void* operator new(size_t size, std::align_val_t alignment) {
61 return operator new(size, static_cast<size_t>(alignment));
62}
63
64void* operator new[](size_t size, std::align_val_t alignment) {
65 return operator new[](size, static_cast<size_t>(alignment));
66}
67
68auto operator delete(void* ptr) noexcept -> void {
69 if (ptr != nullptr) {
70 free(ptr);
71 }
72}
73
74auto operator delete(void* ptr, size_t) noexcept -> void {
75 if (ptr != nullptr) {
76 free(ptr);
77 }
78}
79
80auto operator delete[](void* ptr) noexcept -> void {
81 if (ptr != nullptr) {
82 free(ptr);
83 }
84}
85
86auto operator delete[](void* ptr, size_t) noexcept -> void {
87 if (ptr != nullptr) {
88 free(ptr);
89 }
90}
91
92auto operator delete(void* ptr, size_t, size_t) noexcept -> void {
93 if (ptr != nullptr) {
94 aligned_free(ptr);
95 }
96}
97
98auto operator delete[](void* ptr, size_t, size_t) noexcept -> void {
99 if (ptr != nullptr) {
100 aligned_free(ptr);
101 }
102}
103
104auto operator delete(void* ptr, std::align_val_t) noexcept -> void {
105 if (ptr != nullptr) {
106 aligned_free(ptr);
107 }
108}
109
110auto operator delete[](void* ptr, std::align_val_t) noexcept -> void {
111 if (ptr != nullptr) {
112 aligned_free(ptr);
113 }
114}
115
116auto operator delete(void* ptr, size_t, std::align_val_t) noexcept -> void {
117 if (ptr != nullptr) {
118 aligned_free(ptr);
119 }
120}
121
122auto operator delete[](void* ptr, size_t, std::align_val_t) noexcept -> void {
123 if (ptr != nullptr) {
124 aligned_free(ptr);
125 }
126}
void aligned_free(void *ptr)
Definition memory.cpp:65
void * aligned_alloc(size_t alignment, size_t size)
Definition memory.cpp:58
void * malloc(size_t size)
Definition memory.cpp:31
void free(void *ptr)
Definition memory.cpp:38