You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: doc/reference.rst
+7-7Lines changed: 7 additions & 7 deletions
Original file line number
Diff line number
Diff line change
@@ -223,13 +223,13 @@ C++
223
223
224
224
The C++ standard says the following about the ``new`` operator behavior when encountering heap shortage (memory full):
225
225
226
-
- has to throw a std::bad_alloc C++ exception
226
+
- has to throw a ``std::bad_alloc`` C++ exception
227
227
228
-
- throw an unhandled exception, which means calling abort()
228
+
- throw an unhandled exception, which means calling ``abort()``
229
229
230
230
There are several reasons for the first point above, among which are:
231
231
232
-
- guarantee that the return of new is never a nullptr
232
+
- guarantee that the return of new is never a ``nullptr``
233
233
234
234
- guarantee full construction of the top level object plus all member subobjects
235
235
@@ -239,15 +239,15 @@ C++
239
239
240
240
Historically in Arduino environments, ``new`` is overloaded to simply return the equivalent ``malloc()`` which in turn can return ``nullptr``. In other cores, and up to our core version 2.5.2, that is considered as acceptable.
241
241
242
-
However, this behavior is not C++ standard, and there is good reason for that: there are hidden and very bad side effects. The class and member constructors are always called, even when memory is full (``this``=``nullptr``). In addition, the memory allocation for the top object could succeed, but allocation required for some member object could fail, leaving construction in an undefined state. So the historical behavior of Ardudino's ``new``, when faced with insufficient memory, will lead to bad crashes sooner or later, sometimes unexplainable, generally due to memory corruption even when the returned value is checked and managed.
242
+
However, this behavior is not C++ standard, and there is good reason for that: there are hidden and very bad side effects. The *class and member constructors are always called, even when memory is full* (``this``=``nullptr``). In addition, the memory allocation for the top object could succeed, but allocation required for some member object could fail, leaving construction in an undefined state. So the historical behavior of Ardudino's ``new``, when faced with insufficient memory, will lead to bad crashes sooner or later, sometimes unexplainable, generally due to memory corruption even when the returned value is checked and managed.
243
243
244
244
As of core 2.6.0, we are sticking to the C++ standard. There are two clear cases when ``new`` encounters oom:
245
245
246
246
- C++ exceptions are disabled (default build): ``new`` causes an exception, which in turn calls ``abort()`` and will "cleanly" crash, because there is no way to honor memory allocation or to recover gracefully.
247
247
248
-
- C++ exceptions are enabled (menu option): ``new`` throws a std::bad_alloc C++ exception, which can be caught and handled gracefully. This assures correct behavior, including handling of all subobjects, which guarantees stability.
248
+
- C++ exceptions are enabled (menu option): ``new`` throws a ``std::bad_alloc`` C++ exception, which can be caught and handled gracefully. This assures correct behavior, including handling of all subobjects, which guarantees stability.
249
249
250
-
To allow previous behavior, a new optional global allocator is introduced with a different semantic. It is similar to ``new`` but will return ``nullptr`` without side effects (if ``std::new`` is not used in constructors), as expected in arduino world. Syntax is slightly different:
250
+
To allow previous behavior, a new optional global allocator is introduced with a different semantic. It is similar to ``new`` but will return ``nullptr`` without side effects (if ``std::new`` is not used in constructors), as expected in arduino world.
251
251
252
252
Syntax is slightly different, the following shows the different usages:
253
253
@@ -268,7 +268,7 @@ C++
268
268
// abort() is never called, an exception is not thrown even if they are enabled
269
269
if (sc == nullptr)
270
270
{
271
-
// failed allocation
271
+
// failed allocation, handle here, possible bad hidden effects
0 commit comments