【问题标题】:Unexpected Memory Leak [Valgrind]意外的内存泄漏 [Valgrind]
【发布时间】:2011-01-10 07:14:48
【问题描述】:

今天我只是想检查一下 valgrind 的工作原理。所以我创建了一个简单的程序。

//leak.C
#include<iostream>

class leak
{

   int *p;

   public:

   leak():p(new int[10]()){std::cout<<"Constructor of leak called\n";}
   virtual void set()
   {

       for(int i=0;i<10;++i) p[i]=i*i;
   }

   virtual void display()
   {
       std::cout<<"In leak's display()\n";
       for(int i=0;i<10;++i) std::cout<<p[i]<<std::endl;
   }

   virtual ~leak()
   {
       std::cout<<"Destructor of leak called\n";
       delete[] p;
   }
};

class exleak: public leak
{

     double *r;

     public:

     exleak():r(new double[5]()){std::cout<<"Constructor of exleak called\n";}

     void set()
     {
       leak::set();
       for(int i=0;i<5;i++) r[i]=i*3.0;
     }


     void display()
     {
         leak::display();
         std::cout<<"In exleak's display()\n";
         for(int i=0;i<5;i++)  std::cout<<r[i]<<std::endl;
     }

     ~exleak()
     {

          std::cout<<"Destructor of exleak called\n";
          delete[] r;
     }
};

int main()
{

     leak *x=new exleak();
     x->set();
     x->display();
     delete x;

}

输出符合预期。我预计没有内存泄漏。 我编译了文件leak.C 并生成了一个可执行文件leak。 但是当我输入以下命令valgrind --leak-check=yes --verbose ./leak时,我感到很惊讶。代码有内存泄漏。 :-o

这就是我得到的。

==9320== 
==9320== HEAP SUMMARY:
==9320==     in use at exit: 12 bytes in 1 blocks
==9320==   total heap usage: 3 allocs, 2 frees, 92 bytes allocated
==9320== 
==9320== 12 bytes in 1 blocks are definitely lost in loss record 1 of 1
==9320==    at 0x40263A0: operator new(unsigned int) (vg_replace_malloc.c:214)
==9320==    by 0x8048B0E: main (in /home/prasoon/leak)
==9320== 
==9320== LEAK SUMMARY:
==9320==    definitely lost: 12 bytes in 1 blocks
==9320==    indirectly lost: 0 bytes in 0 blocks
==9320==      possibly lost: 0 bytes in 0 blocks
==9320==    still reachable: 0 bytes in 0 blocks
==9320==         suppressed: 0 bytes in 0 blocks
==9320== 
==9320== For counts of detected and suppressed errors, rerun with: -v
==9320== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 25 from 6)

代码是怎么泄露内存的?

  definitely lost: 12 bytes in 1 blocks //WHERE?

编辑问题已解决

【问题讨论】:

  • 你可以尝试使用leak-check=full,也许它会提供更多信息
  • 我的错,可能我当时犯了一个错误。我再次编译了代码,再次生成了一个可执行文件。现在没有内存泄漏。 :-)
  • 是的,我也试过了(没有看到“问题已解决”)。 valgrind 没有报告泄漏。
  • 顺便说一句,当您复制对象时,此代码会中断。修正你的类定义。

标签: c++ valgrind


【解决方案1】:

gcc (Ubuntu 5.4.0-6ubuntu1~16.04.10) 5.4.0 20160609
valgrind-3.11.0

不会收到任何警告

【讨论】:

    【解决方案2】:

    我在 Linux 上使用 2.6.18-164.11.1.el5 内核和 GCC 4.1.2 进行了尝试,它没有给我任何泄漏

    我没有发现代码有任何问题

    【讨论】:

      【解决方案3】:

      类 exleak 没有虚拟析构函数...

      【讨论】:

      • 那么,这里有什么关系呢?如果leak 的析构函数不是虚拟的,情况会有所不同。
      猜你喜欢
      • 2013-06-24
      • 1970-01-01
      • 2020-03-31
      • 2016-03-15
      • 2014-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多