Подтвердить что ты не робот

С++ new и delete overloading

new и delete перегрузка оператора может работать или не работать при компиляции с использованием разных компиляторов и разных стандартов С++. Это нормальное поведение?

Я использовал следующий код для тестирования компиляторов.

#include <iostream>

void * operator new(size_t size)
{
    std::cout << "1\n";
    return malloc(size);
}

void operator delete(void *ptr) noexcept
{
    std::cout << "2\n";
    free(ptr);
}

int main(void)
{
    int *n1 = new int;
    delete n1;

    int *n2 = new int[10];
    delete[] n2;

    return 0;
}

Вот результаты, которые я получил от нескольких компиляторов, на которых я тестировал код.

mingw-w64 official build - x86_64-7.1.0-release-posix-seh-rt_v5-rev0.7z

c++11
1
2

c++14
1

clang x86_64 - v4.0.0, созданный вручную без исправлений с использованием компилятора выше

c++11 and c++14
1
2

msvc - набор инструментов платформы v141 и sdk v10.0.15063.0

/std:c++14 and /std:c++latest
1
2
1
2

Все тесты выполняются в Windows 7. Я не могу тестировать компиляторы на GNU/Linux OS, потому что у меня нет каких-либо виртуальных машин.

4b9b3361

Ответ 1

По стандарту поведение по умолчанию как operator new[] равно ([new.delete.array]/4):

Возвращает operator new(size) или operator new(size, alignment) соответственно.

Что-то похожее на operator delete[] ([new.delete.array]/15):

Функции, которые имеют параметр size, перенаправляют свои другие параметры на соответствующую функцию без параметра size. Функции, не имеющие параметра size, перенаправляют свои параметры на соответствующую функцию operator delete (один объект).

Стандартные версии этих функций просто вызывают формы без массива. Поэтому Visual Studio и GCC 6.3 верны: перегрузка только версий, отличных от массива, должна быть достаточной для перегрузки распределителей.