Когда я запускаю этот пример кода в GCC и Clang
struct S
{
int a;
void *operator new(size_t s)
{
std::cout << "new " << s << std::endl;
return ::operator new(s);
}
void operator delete(void *p, size_t s) noexcept
{
std::cout << "delete " << s << std::endl;
::operator delete(p);
}
void operator delete(void *p) noexcept
{
std::cout << "delete " << "none" << std::endl;
::operator delete(p);
}
};
int main()
{
S *p = new S;
delete p;
}
Я получаю следующий вывод от GCC и Clang
new 4
delete none
, что означает, что компиляторы выбрали «безразмерную» версию operator delete
.
Однако, если я попробую что-то похожее с глобально замененными operator new
и operator delete
функциями
struct S
{
int a;
};
void *operator new(size_t s)
{
std::cout << "new " << s << std::endl;
return std::malloc(s);
}
void operator delete(void *p, size_t s) noexcept
{
std::cout << "delete " << s << std::endl;
std::free(p);
}
void operator delete(void *p) noexcept
{
std::cout << "delete " << "none" << std::endl;
std::free(p);
}
int main()
{
S *p = new S;
delete p;
}
Из GCC я получаю
new 4
delete 4
и из Clang я получаю
new 4
delete none
Я знаю, что "размерная" версия класса operator delete
присутствует в C ++ начиная с C ++ 98, но, просматривая C ++ 98, я не могу найти окончательного ответа на Вопрос о том, какую версию operator delete
следует выбрать в первом примере. Это вообще указано?
А как насчет C ++ 14 и его "размерной" версии global operator delete
во втором примере? Язык говорит, какую версию следует выбрать?