Skip to content

Commit 146d1f5

Browse files
committed
doc
1 parent d615e8c commit 146d1f5

File tree

1 file changed

+7
-7
lines changed

1 file changed

+7
-7
lines changed

doc/reference.rst

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -223,13 +223,13 @@ C++
223223

224224
The C++ standard says the following about the ``new`` operator behavior when encountering heap shortage (memory full):
225225

226-
- has to throw a std::bad_alloc C++ exception
226+
- has to throw a ``std::bad_alloc`` C++ exception
227227

228-
- throw an unhandled exception, which means calling abort()
228+
- throw an unhandled exception, which means calling ``abort()``
229229

230230
There are several reasons for the first point above, among which are:
231231

232-
- guarantee that the return of new is never a nullptr
232+
- guarantee that the return of new is never a ``nullptr``
233233

234234
- guarantee full construction of the top level object plus all member subobjects
235235

@@ -239,15 +239,15 @@ C++
239239

240240
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.
241241

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.
243243

244244
As of core 2.6.0, we are sticking to the C++ standard. There are two clear cases when ``new`` encounters oom:
245245

246246
- 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.
247247

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.
249249

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.
251251

252252
Syntax is slightly different, the following shows the different usages:
253253

@@ -268,7 +268,7 @@ C++
268268
// abort() is never called, an exception is not thrown even if they are enabled
269269
if (sc == nullptr)
270270
{
271-
// failed allocation
271+
// failed allocation, handle here, possible bad hidden effects
272272
}
273273
else
274274
{

0 commit comments

Comments
 (0)