Why GCC prefers global size-unaware deallocation function?
Ruslan Garipov
brigadir15@gmail.com
Sun Dec 4 15:43:00 GMT 2016
Oops! I was confused with English languagw again, sorry!
> or a (possibly multi-dimensional) array thereof
This still refers " class type with a non-trivial destructor". Therefore,
(10.4) comes into play in my case:
> (10.4) Otherwise, it is unspecified whether a deallocation function with a
> parameter of type std::size_t is selected.
Thanks for help, anyway!
Yours truly,
brigadir15 at gmail dot com.
On December 4, 2016 7:50:17 PM Avi Kivity <avi@scylladb.com> wrote:
>
>
> On 12/04/2016 02:26 PM, Ruslan Garipov wrote:
>> I have the following `operator delete` replacements:
>>
>> void operator delete[](void* p)
>> {
>> /* Implementation does not matter. */
>> }
>>
>> void operator delete[](void* p, std::size_t size)
>> {
>> /* Implementation does not matter. */
>> }
>>
>> My question is why, in the following code, GCC 6.2 calls `void
>> operator delete[](void*)` and not the second replacement:
>>
>> char* str = new char[14];
>> delete[] str;
>>
>>
>> According to 5.3.5 Delete [expr.delete]:
>>
>>> (10.3) If the type is complete and if, for the second alternative (delete
>>> array) only, the operand is a pointer to a class type with a non-trivial
>>> destructor or a (possibly multi-dimensional) array thereof, the function
>>> with a parameter of type std::size_t is selected.
>> Therefore, I believe `operator delete[](void*, std::size_t)` must be
>> called, doesn't it?
>>
>
> char is not a class type with a non-trivial destructor, so the second
> condition does not hold.
>
> Under the hood, if C++ allocates an array with non-trivial destructors,
> it must also store the size of the array so it knows how many
> destructors to call, and can then use the stored size of the array to
> call the sized deallocator function. In this case, there's no need to
> call the destructors, so C++ only allocates 14 chars, and does not store
> the size.
More information about the Gcc-help
mailing list