This is an automated email from the ASF dual-hosted git repository. bneradt pushed a commit to branch dev-1-2-7 in repository https://gitbox.apache.org/repos/asf/trafficserver-libswoc.git
commit 9d8f6f5338544d7810648e1029c485c3bed4985a Author: Alan M. Carroll <[email protected]> AuthorDate: Fri Jun 19 12:32:39 2020 -0500 Fix override of operator delete and constructor for MemArena::Block. --- code/include/swoc/MemArena.h | 38 ++++++++++++++++++++++++++++++-------- code/src/MemArena.cc | 5 ----- 2 files changed, 30 insertions(+), 13 deletions(-) diff --git a/code/include/swoc/MemArena.h b/code/include/swoc/MemArena.h index 36cf131..2bdaf68 100644 --- a/code/include/swoc/MemArena.h +++ b/code/include/swoc/MemArena.h @@ -72,17 +72,36 @@ public: /// @return @c true if the block has at least @c MIN_FREE_SPACE bytes free. bool is_full() const; - /** Override standard delete. + + protected: + friend MemArena; + + /** Override @c operator @c delete. * - * This is required because the allocated memory size is larger than the class size which requires - * calling @c free differently. + * This is required because the allocated memory size is larger than the class size which + * requires calling @c free directly, skipping the destructor and avoiding complaints about size + * mismatches. * * @param ptr Memory to be de-allocated. */ - static void operator delete(void *ptr); + static void operator delete(void * ptr) noexcept; - protected: - friend MemArena; + /** Override placement (non-allocated) @c delete. + * + * @param ptr Pointer returned from @c new + * @param place Value passed to @c new. + * + * This is called only when the class constructor throws an exception during placement new. + * + * @note I think the parameters are described correctly, the documentation I can find is a bit + * vague on the source of these values. It is required even if the constructor is marked @c + * noexcept. Both are kept in order to be documented. + * + * @internal This is required by ICC, but not GCC. Annoying, but it appears this is a valid + * interpretation of the spec. In practice this is never called because the constructor does + * not throw. + */ + static void operator delete([[maybe_unused]] void * ptr, void * place) noexcept; /** Construct to have @a n bytes of available storage. * @@ -90,7 +109,7 @@ public: * memory already allocated immediately after this instance. * @param n The amount of storage. */ - explicit Block(size_t n); + explicit Block(size_t n) noexcept; size_t size; ///< Actual block size. size_t allocated{0}; ///< Current allocated (in use) bytes. @@ -389,7 +408,7 @@ inline auto MemArena::Block::Linkage::prev_ptr(Block *b) -> Block *& { return b->_link._prev; } -inline MemArena::Block::Block(size_t n) : size(n) {} +inline MemArena::Block::Block(size_t n) noexcept : size(n) {} inline char *MemArena::Block::data() { return reinterpret_cast<char *>(this + 1); @@ -441,6 +460,9 @@ inline MemArena::Block& MemArena::Block::discard() { return *this; } +inline void MemArena::Block::operator delete(void *ptr) noexcept { ::free(ptr); } +inline void MemArena::Block::operator delete([[maybe_unused]] void * ptr, void * place) noexcept { ::free(place); } + inline size_t MemArena::size() const { return _active_allocated; } diff --git a/code/src/MemArena.cc b/code/src/MemArena.cc index f5a3e77..fe22823 100644 --- a/code/src/MemArena.cc +++ b/code/src/MemArena.cc @@ -10,11 +10,6 @@ namespace swoc { inline namespace SWOC_VERSION_NS { -void -MemArena::Block::operator delete(void *ptr) { - ::free(ptr); -} - // Need to break these out because the default implementation doesn't clear the // integral values in @a that.
