2013-02-19 1 views
7

Я столкнулся с проблемой утечки памяти в коде, в то время как его запуск, куча продолжает увеличиваться до максимума, и мне нужно перезапустить службу, я запустил верхнюю команду и увидел, что куча увеличивается, когда im вызывает сценарий в оказание услуг.valgrind Условный переход или перемещение зависит от неинициализированного значения (s), это указывает на утечку памяти?

Я побежал службу с Valgrind,

valgrind --log-file=log-feb19.txt --leak-check=full --show-reachable=yes --track-origins=yes myservice 

Я выигрыш видит определенно потерянные или, возможно, потерянные блоки, а РМОК запуск сценариев, но я вижу много условного переход или переезда зависит от неинициализированного значения (s) ошибки.

Учитываются ли эти данные для утечки памяти?

Пример того, что я получаю:

==27278== Conditional jump or move depends on uninitialised value(s) 

==27278== at 0xC90D91E: xcsFreeMemFn (in /apps/opt/mqm/lib64/libmqmcs_r.so) 

........

==27278== Uninitialised value was created by a heap allocation 

==27278== at 0x4A078B8: malloc (vg_replace_malloc.c:270) 

==27278== by 0xC90E32F: xcsGetMemFn (in /apps/opt/mqm/lib64/libmqmcs_r.so) 

Может кто-то помочь.

+0

Вы нашли правильный ответ? если это так, отметьте один как правильный, пожалуйста. – logoff

+0

Возможный дубликат [pinpointing] условный переход или перемещение зависит от неинициализированных значений «valgrind message» (http://stackoverflow.com/questions/2612447/pinpointing-conditional-jump-or-move-depends-on-uninitialized -values-valgrin) –

ответ

15

Нет, это означает, что вы обращаетесь к памяти, которая не была инициализирована:

int main() 
{ 
    int unitialized; 
    std::cout << unitialized << std::endl; 
} 

бы вызвать эту ошибку.

Чуть более распространенным будет:

struct X 
{ 
    X() : i(42) { } 
    private: 
    int i; 
    int* forgotten; // oops, not initialized 
}; 

Наконец, это часто случается с кодом на основе таНос, когда вы не используете memset, чтобы очистить весь буфер. Так,

  1. таНоса размера буфера м
  2. чтение (например, из сокета) п байты
  3. записи м байт в файл; (m-n) байты не были бы инициализированы
+0

Я согласен, что это не указывает на утечку памяти, но поскольку она вызывает неопределенное поведение, это может привести к чему-либо –

1

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

+2

В C использование неинициализированного объекта не является определённым поведением. Это только UB, если объект «мог быть объявлен с помощью« register », то есть если его адрес никогда не был принят. Чтение неинициализированной памяти через указатель отлично (из этого POV). Это разветвление на такие ценности, о которых справедливо жалуется valgrind. –

4

Это объясняется в Valgrind руководстве пользователя, в разделе 4.2.2. Use of uninitialised values:

Ошибка использования неинициализированные значение сообщается, когда ваша программа использует значение, которое не инициализируется - другими словами, не определено.

...

Важно понять, что ваша программа может копировать вокруг (неиницализированные) данных барахла столько, сколько он захочет. Memcheck наблюдает за этим и отслеживает данные, но не жалуется. Жалоба выдается только тогда, когда ваша программа пытается использовать неинициализированные данные таким образом, который может повлиять на внешнее видимое поведение вашей программы .