zoukankan      html  css  js  c++  java
  • C++ valgrind detect memory leak

    1.Install valgrind in ubuntu

    sudo apt-get install valgrind 

    2.Write the code in cpp for demonstration.Ignore the free allocated memory on purpose.

    #include <iostream>
    #include <uuid/uuid.h>
    #include <time.h>
    #include <unistd.h>
    
    using namespace std;
    
    static unsigned int num=0;
    void retrieveUuid1(char *uuidValue);
    void testMemoryLeak2();
    
    int main()
    {
        testMemoryLeak2();
        return 0;
    }
    
    void testMemoryLeak2()
    {
        while (1)
        {
            char *uuidValue = (char *)malloc(4000000000);
            retrieveUuid1(uuidValue);
            cout << "Index=" << ++num << ",Value=" << uuidValue << endl;
            usleep(100000);
        }
    }
    
    void retrieveUuid1(char *uuidValue)
    {
        uuid_t newUUID;
        uuid_generate(newUUID);
        uuid_unparse(newUUID, uuidValue);
    }

    3.Compile

    g++ -g -std=c++2a h1.cpp -o h1 -luuid

    4.Run the compiled assembly via Valgrind

    valgrind --tool=memcheck --leak-check=full --show-leak-kinds=all  ./h1

    5.The executed effect as the snapshot

     Analyze the above and searched via web from page   https://stackoverflow.com/questions/9956359/valgrind-and-memory-leaks

    With Memcheck's memory leak detector, what's the difference between "definitely lost", "indirectly lost", "possibly lost", "still reachable", and "suppressed"?
    
    The details are in the Memcheck section of the user manual.
    
    In short:
    
    "definitely lost" means your program is leaking memory -- fix those leaks!
    
    "indirectly lost" means your program is leaking memory in a pointer-based structure. (E.g. if the root node of a binary tree is "definitely lost", all the children will be "indirectly lost".) If you fix the "definitely lost" leaks, the "indirectly lost" leaks should go away.
    
    "possibly lost" means your program is leaking memory, unless you're doing unusual things with pointers that could cause them to point into the middle of an allocated block; see the user manual for some possible causes. Use --show-possibly-lost=no if you don't want to see these reports.
    
    "still reachable" means your program is probably ok -- it didn't free some memory it could have. This is quite common and often reasonable. Don't use --show-reachable=yes if you don't want to see these reports.
    
    "suppressed" means that a leak error has been suppressed. There are some suppressions in the default suppression files. You can ignore suppressed errors.

    6.Inspect the warning message and compared with the source code file line 22

     

    Which shows it does not free the allocated memory and lead to this failure.

     

  • 相关阅读:
    [iPad]PencilKit教程3、检查,修改和构造PencilKit绘图
    [iPad]PencilKit教程2、PencilKit的新功能
    [iPad]PencilKit教程1、PencilKit介绍
    为什么要谨慎使用Arrays.asList、ArrayList的subList?
    精通高并发与多线程,却不会用ThreadLocal?
    拥抱Kubernetes,再见了,SpringBoot @Scheduled
    从小公司进入大厂,我都做对了哪些事?
    总结我的Java朋友
    MySQL如何实时同步数据到ES?试试这款阿里开源的神器!
    基于Java访问数据库
  • 原文地址:https://www.cnblogs.com/Fred1987/p/15722546.html
Copyright © 2011-2022 走看看