2015-06-18 19 views
7

Considerate questo semplice esempio:Come posso tenere traccia dell'allocazione di memoria delle chiamate di libreria standard C++?

#include <algorithm> 
#include <iostream> 
#include <list> 
#include <numeric> 
#include <random> 
#include <vector> 
#include <iterator> 
int main() 
{ 
    std::list<int> l(10); 
    std::iota(l.begin(),l.end(),77); 

    std::vector<std::list<int>::iterator> v(l.size()); 
    std::iota(v.begin(), v.end(), l.begin()); 

    std::vector<int> dest; 
    std::copy_if(l.begin(), l.end(), std::back_inserter(dest), [](int i){return i%2==1;}); 

    for(auto n : dest) 
     std::cout << n << " "; 
    return 0; 
} 

Quando viene eseguito sotto Valgrind, mi dà il seguente risultato:

==27353== total heap usage: 15 allocs, 15 frees, 380 bytes allocated 

E 'possibile monitorare esattamente dove queste allocazioni si è verificato (cioè quale struttura di dati effettuata l'assegnazione e quando esattamente)?

+0

hai provato [massif] (http://valgrind.org/docs/manual/ms-manual.html)? –

+0

@ m.s. Ho appena fatto ma l'output è stato lo stesso. – syntagma

+0

è necessario eseguire 'ms_print massif.out.12345' (il numero varia) dopo aver eseguito' valgrind --tool = massif –

risposta

2

Il modo corretto per monitorare C++ chiamate di allocazione di libreria è quello di utilizzare Massif, uno strumento mucchio profilatore (parte di Valgrind):

  1. Run Valgrind con massiccio abilitato:

    valgrind --tool=massif

  2. Utilizzare ms_print per analizzare l'output da Massif:

    ms_print massif.out.12345 (number varies)