2013-02-19 7 views
7

Sto affrontando un problema di perdita di memoria nel codice, mentre è in esecuzione, l'heap continua ad aumentare al massimo e ho bisogno di riavviare il servizio, ho eseguito il comando top e vedo che l'heap sta aumentando ogni volta che sto invocando uno scenario nel servizio.valgrind Il salto o lo spostamento condizionato dipende dai valori non inizializzati, ciò indica perdita di memoria?

ho eseguito il servizio con valgrind,

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

I donot vedere i blocchi definitivamente persi o, eventualmente persi durante iam esecuzione degli scenari, ma vedo un sacco di salto condizionato o spostare dipende il valore Non inizializzato (s) errori.

Questi contano per una perdita di memoria?

esempio di quello che sto ottenendo:

==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) 

qualcuno può aiutarmi.

+0

hai trovato la risposta corretta? se lo è, segna uno come corretto, per favore. – logoff

+0

il possibile duplicato di [individuare "il salto condizionale o lo spostamento dipende dal/i valore/i non inizializzato/i" messaggio valgrind] (http://stackoverflow.com/questions/2612447/pinpointing-conditional-jump-or-move-depends-on-uninitialized -valori-valgrin) –

risposta

15

No, significa che si accede a memoria che non è stato inizializzato:

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

sarebbe innescare questo errore.

leggermente più comune sarebbe:

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

Infine, questo accade spesso con codice basato malloc, quando non si utilizza memset per cancellare l'intero buffer. Quindi,

  1. malloc una dimensione di buffer m
  2. lettura (ad esempio da un socket) n byte
  3. scrittura m byte in un file; (m-n) byte non sarebbero stati inizializzati
+0

Sono d'accordo che questo non indica una perdita di memoria ma poiché invoca un comportamento indefinito può portare a qualsiasi cosa –

1

No questo non indica perdite di memoria direttamente. Comunque avere un salto condizionato a seconda di una variabile non inizializzata può portare praticamente a qualsiasi cosa. L'uso di variabili non inizializzate in generale richiama il comportamento non definito.

+2

In C, l'utilizzo di un oggetto non inizializzato non è un comportamento non definito di per sé. È solo UB se l'oggetto "potrebbe essere stato dichiarato con' register' ", cioè se il suo indirizzo non è mai stato preso. La lettura della memoria non inizializzata attraverso un puntatore è perfettamente soddisfacente (da quel POV). È la ramificazione di tali valori che valgrind si lamenta giustamente. –

4

E 'spiegato nel manuale dell'utente Valgrind, nella sezione 4.2.2. Use of uninitialised values:

un errore uso Non inizializzato valore viene segnalato quando il programma utilizza un valore che non è stato inizializzato - in altre parole, è non definito.

...

E 'importante capire che il programma può copiare i dati intorno spazzatura (non inizializzate) tanto quanto lo ama. Memcheck osserva questo e tiene traccia dei dati, ma non si lamenta. Un reclamo è emesso solo quando il programma tenta di utilizzare i dati non inizializzati in un modo che potrebbe influire sul comportamento visibile esternamente del programma.

Problemi correlati