Я использую tcmalloc в течение нескольких месяцев в большом проекте, и до сих пор я должен сказать, что я очень доволен этим, прежде всего его функциями HeapProfiling, которые позволяют отслеживать утечки памяти и удалять их.Неожиданное поведение от tcmalloc
За последние пару недель, хотя мы испытали случайные сбои в нашем приложении, и мы не смогли найти источник случайного сбоя. В очень конкретной ситуации, когда приложение разбилось, мы оказались с полностью поврежденным стеком для одного из потоков приложений. Несколько раз вместо этого я обнаружил, что потоки застряли в tcmalloc :: PageHeap :: AllocLarge(), но поскольку у меня нет отладочных символов tcmalloc, я не мог понять, в чем проблема.
После почти одной недели расследования, сегодня я попробовал самые простые вещи: удалил tcmalloc из уст новки, чтобы не использовать его, просто чтобы узнать, что произошло. Ну ... я, наконец, узнал, что проблема была, и код обижая очень похож на это:
void AllocatingFunction()
{
Object object_on_stack;
ProcessObject(&object_on_stack);
}
void ProcessObject(Object* object)
{
...
// Do Whatever
...
delete object;
}
Использование Libc приложение по-прежнему разбился, но я, наконец, увидел, что я звоню удалить на объект, который был выделенных в стеке.
Что я до сих пор не могу понять, почему tcmalloc вместо этого сохранил приложение, несмотря на это очень рискованное (если не совсем ошибочное) освобождение объекта, и двойное освобождение, когда object_on_stack выходит из области действия при завершении AllocatingFunction. Дело в том, что оскорбительный код можно было бы называть неоднократно без какого-либо намека на лежащую в основе мерзость.
Я знаю, что освобождение памяти является одним из тех «неопределенных действий», когда они не используются должным образом, но мое удивление - это такое поведение между «стандартным» libc и tcmalloc.
У кого-нибудь есть какое-то объяснение понимания, почему tcmalloc поддерживает работу приложения?
Заранее спасибо :)
имеют хороший день
Они выбрали свое «неопределенное поведение» для * не сбой *. Я полагаюсь на это? *Конечно нет*. – WhozCraig