意外内存泄漏 [Valgrind]

3

今天我只是想试试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,也许会提供更多信息。 - Yogesh Arora
1
我的错,可能我那时犯了一个错误。我又编译了代码,重新生成了可执行文件。现在没有内存泄漏了。 :-) - Prasoon Saurav
是的,我也刚试了一下(没有看到“问题已解决”)。Valgrind 没有报告任何泄漏。 - Bernhard Kausler
顺便提一下,当你复制对象时,这段代码会出错。请修正你的类定义。 - Lightness Races in Orbit
3个回答

2

我在Linux系统上,使用2.6.18-164.11.1.el5内核和GCC 4.1.2尝试了这个代码,没有发现任何泄漏。

我认为这段代码没有任何问题。


0

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

没有任何警告

enter image description here


-1

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


那么,在这里它有什么影响呢?如果leak的析构函数不是虚拟的,情况可能会有所不同。 - Prasoon Saurav

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接