首页 > 试题广场 >

请你来回答一下什么是memory leak,也就是内存泄漏

[问答题]

请你来回答一下什么是memory leak,也就是内存泄漏

  • 都明确问啥是Memory Leak?实例回答里为啥还说什么资源泄露,什么destructor 不是virtual
  • 我认为内存泄露就是该释放的内存没释放,使内存无法被二次利用,出现的这种现象称为内存泄漏。
  • 由于基址丢失,导致无法调用free释放
  • 另外我觉得循环引用造成智能指针无法自动释放内存,也属于内存泄漏。使用者可能想要释放相互引用的对象,但是由于引用计数不清零而导致智能指针无法主动释放内存。首地址并未丢失,但是占用的内存也没有被释放,其实对象已经没有存在的必要了。
发表于 2020-05-17 15:57:37 回复(0)
将可能会被继承的父类的析构函数设置为虚函数,可以保证当我们new一个子类,然后使用基类指针指向该子类对象,释放基类指针时可以释放掉子类的空间,防止内存泄漏。
发表于 2021-03-20 11:17:23 回复(1)
内存泄漏(memory leak)是指由于疏忽或错误造成了程序未能释放掉不再使用的内存的情况。内存泄漏并非指内存在物理上的消失,而是应用程序分配某段内存后,由于设计错误,失去了对该段内存的控制,因而造成了内存的浪费。 内存泄漏的分类: 1. 堆内存泄漏 (Heap leak)。对内存指的是程序运行中根据需要分配通过malloc,realloc new等从堆中分配的一块内存,再是完成后必须通过调用对应的 free或者delete 删掉。如果程序的设计的错误导致这部分内存没有被释放,那么此后这块内存将不会被使用,就会产生Heap Leak. 2. 系统资源泄露(Resource Leak)。主要指程序使用系统分配的资源比如 Bitmap,handle ,SOCKET等没有使用相应的函数释放掉,导致系统资源的浪费,严重可导致系统效能降低,系统运行不稳定。 3. 没有将基类的析构函数定义为虚函数。当基类指针指向子类对象时,如果基类的析构函数不是virtual,那么子类的析构函数将不会被调用,子类的资源没有正确是释放,因此造成内存泄露。 都明确问啥是Memory Leak?实例回答里为啥还说什么资源泄露,什么destructor 不是virtual 我认为内存泄露就是该释放的内存没释放,使内存无法被二次利用,出现的这种现象称为内存泄漏。 由于基址丢失,导致无法调用free释放 另外我觉得循环引用造成智能指针无法自动释放内存,也属于内存泄漏。使用者可能想要释放相互引用的对象,但是由于引用计数不清零而导致智能指针无法主动释放内存。首地址并未丢失,但是占用的内存也没有被释放,其实对象已经没有存在的必要了。
编辑于 2020-09-04 10:10:47 回复(0)