limon_spb
@limon_spb

Переопределение operator delete [] для класса. Глюк?

Добрый день, господа.

Понадобилось в проекте заменить кучу на "кастомную".
Читаю на cppreference про оператор delete []. Там есть такой код:
#include <iostream>
// sized class-specific deallocation functions
struct X {
    static void operator delete(void* ptr, std::size_t sz)
    {
        std::cout << "custom delete for size " << sz << '\n';
        ::operator delete(ptr);
    }
    static void operator delete[](void* ptr, std::size_t sz)
    {
        std::cout << "custom delete for size " << sz << '\n';
        ::operator delete(ptr);
    }
};
int main() {
     X* p1 = new X;
     delete p1;
     X* p2 = new X[10];
     delete[] p2;
}

Possible output:
custom delete for size 1
custom delete for size 18


Под убунтой с GCC этот код работает. Все ок. Вот, например, на ideone.com:
https://ideone.com/KxXjuG

А вот в Cтудии какой-то бред:
custom delete for size 1
custom delete for size 1

Онлайн студийный компилятор с тем же примером:
rextester.com/QUKDSZ7278

Как быть? Необходимо измерять размер кучи. Но если в delete[] попадает какой-то бред вместо размера, то измерения получаются бессмысленными. Где я затупил?

PS: при этом в operator new [], если его дописать, попадает правильный размер массива + sizeof указателя.
  • Вопрос задан
  • 298 просмотров
Решения вопроса 1
@MiiNiPaa
Это баг в Visual Studio. Можно его обойти, если объявить деструктор для класса.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы