Утечка памяти C++ в специализации шаблона

Я не могу понять, что происходит в следующем коде:

template<typename X>
class TestClass {
public:
    void alloc(X x) {
    }
};

template<>
void TestClass<int>::alloc(int x) {
    char* buf = new char[1];
    delete[] buf;
}

int main() {
    return 0;
}

Таким образом, main не объявляет и не создает экземпляр TestClass. TestClass определяется только с помощью шаблона и определения специализации шаблона для int. Метод alloc делает новое, но метод никогда не вызывается. Однако, если я запускаю valgrind, я получаю следующее:

==62783== HEAP SUMMARY:
==62783==     in use at exit: 72,704 bytes in 1 blocks
==62783==   total heap usage: 1 allocs, 0 frees, 72,704 bytes allocated
==62783== 
==62783== 72,704 bytes in 1 blocks are still reachable in loss record 1 of 1
==62783==    at 0x4C2DB8F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==62783==    by 0x4EC3EFF: ??? (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.21)
==62783==    by 0x40106C9: call_init.part.0 (dl-init.c:72)
==62783==    by 0x40107DA: call_init (dl-init.c:30)
==62783==    by 0x40107DA: _dl_init (dl-init.c:120)
==62783==    by 0x4000C69: ??? (in /lib/x86_64-linux-gnu/ld-2.23.so)
==62783== 
==62783== LEAK SUMMARY:
==62783==    definitely lost: 0 bytes in 0 blocks
==62783==    indirectly lost: 0 bytes in 0 blocks
==62783==      possibly lost: 0 bytes in 0 blocks
==62783==    still reachable: 72,704 bytes in 1 blocks
==62783==         suppressed: 0 bytes in 0 blocks
==62783== 
==62783== For counts of detected and suppressed errors, rerun with: -v
==62783== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)

Если вы закомментируете строку buf = new, вы получите:

==64665== HEAP SUMMARY:
==64665==     in use at exit: 0 bytes in 0 blocks
==64665==   total heap usage: 0 allocs, 0 frees, 0 bytes allocated
==64665== 
==64665== All heap blocks were freed -- no leaks are possible

Итак, почему память выделяется, но никогда не освобождается, если этот код не выполняется? Это урезанный пример из более сложного кода, где я столкнулся с такой ситуацией и не смог понять причину. Не спрашивайте, зачем я это сделал, это не актуально, я знаю, что могу переписать код, чтобы избежать этого, вопрос в том, почему это происходит? Это ошибка компилятора?

Спасибо, Виктор


person Victor Olaru    schedule 18.11.2019    source источник
comment
не могли бы вы предоставить версию компилятора?   -  person MarcinG    schedule 18.11.2019
comment
В этом коде нет утечки. Все потерянные категории равны нулю.   -  person Shawn    schedule 18.11.2019
comment
конечно, версия gcc: gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.12)   -  person Victor Olaru    schedule 18.11.2019
comment
Связано или дублировано: stackoverflow.com/questions/30376601/   -  person Davide Spataro    schedule 18.11.2019
comment
Кроме того, нельзя дублировать ваши результаты. Я получаю total heap usage: 1 allocs, 1 frees, 72,704 bytes allocated.   -  person Shawn    schedule 18.11.2019
comment
это здорово @Shawn, можете ли вы предоставить версию gcc и valgrind? возможно мне нужно обновить, и было бы полезно знать версию, где это не воспроизводится, спасибо   -  person Victor Olaru    schedule 18.11.2019
comment
Я обновил valgring до 3.15.0 и теперь получил тот же результат: total heap usage: 1 allocs, 1 frees, 72,704 bytes allocated, однако при комментировании кода, который не должен запускаться, я получаю: total heap usage: 0 allocs, 0 frees, 0 bytes allocated, так в чем разница?   -  person Victor Olaru    schedule 18.11.2019