On Thu, Apr 09, 2020 at 08:59:59AM +0200, Martin Liška wrote:
> What do you mean by 'decl flags'. We can't compare ASM names as one is ctor
> and the second one is dtor. It's about argument types that much match, right?

You can't disginguish the [] vs. non-[] from arguments, plus there are some
changes in the arguments in all cases anyway (e.g. first argument of
operator delete always being the pointer, while first argument of operator
new being size_t, but some operator delete forms also having size_t after
it).
See http://eel.is/c++draft/new.delete 
[[nodiscard]] void* operator new(std::size_t size);
[[nodiscard]] void* operator new(std::size_t size, std::align_val_t alignment);
[[nodiscard]] void* operator new(std::size_t size, const std::nothrow_t&) 
noexcept;
[[nodiscard]] void* operator new(std::size_t size, std::align_val_t alignment, 
const std::nothrow_t&) noexcept;
void operator delete(void* ptr) noexcept;
void operator delete(void* ptr, std::size_t size) noexcept;
void operator delete(void* ptr, std::align_val_t alignment) noexcept;
void operator delete(void* ptr, std::size_t size, std::align_val_t alignment) 
noexcept;
void operator delete(void* ptr, const std::nothrow_t&) noexcept;
void operator delete(void* ptr, std::align_val_t alignment, const 
std::nothrow_t&) noexcept;
[[nodiscard]] void* operator new[](std::size_t size);
[[nodiscard]] void* operator new[](std::size_t size, std::align_val_t 
alignment);
[[nodiscard]] void* operator new[](std::size_t size, const std::nothrow_t&) 
noexcept;
[[nodiscard]] void* operator new[](std::size_t size, std::align_val_t 
alignment, const std::nothrow_t&) noexcept;
void operator delete[](void* ptr) noexcept;
void operator delete[](void* ptr, std::size_t size) noexcept;
void operator delete[](void* ptr, std::align_val_t alignment) noexcept;
void operator delete[](void* ptr, std::size_t size, std::align_val_t alignment) 
noexcept;
void operator delete[](void* ptr, const std::nothrow_t&) noexcept;
void operator delete[](void* ptr, std::align_val_t alignment, const 
std::nothrow_t&) noexcept;

I believe one can't allocate with operator new and free with operator delete[]
or allocate with operator new[] and free with operator delete, but am not
sure if there aren't other requirements?
E.g. "If the alignment parameter is not present, ptr was returned by an 
allocation function
without an alignment parameter.  If present, the alignment argument is equal to 
the
alignment argument passed to the allocation function that returned ptr."
suggests one can't mix the std::align_val_t vs. non-std::align_val_t cases,
dunno about the throwing vs. non-throwing or sizd ones.

        Jakub

Reply via email to