簡體   English   中英

如何跟蹤C ++標准庫調用的內存分配?

[英]How can I track memory allocation of C++ standard library calls?

考慮這個簡單的例子:

#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;
}

在Valgrind下運行時,它給出了以下輸出:

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

是否有可能准確跟蹤這些分配發生的位置(即哪個數據結構執行分配以及何時執行)?

跟蹤C ++庫分配調用的正確方法是使用Massif ,一個堆分析器工具(Valgrind的一部分):

  1. 運行Valgrind並啟用Massif:

    valgrind --tool=massif

  2. 使用ms_print分析Massif的輸出:

    ms_print massif.out.12345 (number varies)

嘗試給valgrind --keep-stacktraces=alloc選項。 注意使用該選項會增加使用valgrind的開銷。 以下是文檔http://valgrind.org/docs/manual/mc-manual.html#mc-manual.options,因此您可以微調valgrind捕獲的內容。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM