FAQ, включенный в версию 3.6.1 исходного кода Valgrind, развивает немного больше:
«возможно, потеряно» означает, что ваша программа утечка памяти, если вы не делаете необычные вещи с указателямиэто может заставить их указывать на середину выделенного блока ;см. руководство пользователя для некоторых возможных причин.Используйте --show-возможно-lost = no, если вы не хотите видеть эти отчеты.
(5.2. Разное, FAQ по Valgrind)
В руководстве пользователя Valgrind говорится окак он отслеживает все блоки кучи, выделенные с помощью malloc / new, и описывает два способа отслеживания памяти:
- Поддерживая «указатель начала» на начало блока памяти
- Поддерживая внутренний указатель на какое-то место в середине блока
Три ситуации, в которых могут возникать внутренние указатели:
- Первоначально указатель мог быть указателем начала и перемещался программой намеренно (или не намеренно).
- Это может быть случайное значение нежелательной памяти в памяти, совершенно не связанное, просто совпадение.
- Это может быть указатель на массив объектов C ++ (которые имеют деструкторы), выделенных с помощью нового [].
Возможные сценарии:
Pointer chain AAA Category BBB Category
------------- ------------ ------------
(5) RRR ------?-----> BBB (y)DR, (n)DL
(6) RRR ---> AAA -?-> BBB DR (y)IR, (n)DL
(7) RRR -?-> AAA ---> BBB (y)DR, (n)DL (y)IR, (n)IL
(8) RRR -?-> AAA -?-> BBB (y)DR, (n)DL (y,y)IR, (n,y)IL, (_,n)DL
Pointer chain legend:
- RRR: a root set node or DR block
- AAA, BBB: heap blocks
- --->: a start-pointer
- -?->: an interior-pointer
Category legend:
- DR: Directly reachable
- IR: Indirectly reachable
- DL: Directly lost
- IL: Indirectly lost
- (y)XY: it's XY if the interior-pointer is a real pointer
- (n)XY: it's XY if the interior-pointer is not a real pointer
- (_)XY: it's XY in either case
(4.2.7Обнаружение утечки памяти, использование Valgrindr manual)
Оказывается, предупреждение «Возможно, потеряно» охватывает блок 5-8 (для BBB) выше.
Это означает, что цепочка из одного или несколькихуказатели на блок найдены, но по крайней мере один из указателей является внутренним указателем.Это может быть просто случайное значение в памяти, которое указывает на блок, и поэтому вам не следует считать это нормальным, если вы не знаете, что у вас есть внутренние указатели.
(4.2.7. Памятьобнаружение утечек, руководство пользователя Valgrind)
ТАК, довольно длинным путем мы пришли к тому же выводу, что и fbafelipe, то есть;при условии, что вы используете API правильно, либо sqlite теряет немного памяти, либо использует один из допустимых случаев выше.Учитывая зрелость проектов sqlite, вероятно, можно с уверенностью предположить, что предупреждение не вызывает особых опасений.
Если вы предоставите больше информации о том, как вы используете API (и при каких обстоятельствах происходит утечка)другие люди могут предоставить больше информации.
Ссылка: Источник Valgrind 3.6.1, doc / faq.html, doc / mc-manual.html