内存泄漏问题探讨

其实我们大家都听说过内存泄漏这个概念,但是真正能理解什么情况能造成内存泄漏、内存泄漏会出现什么情况、如何避免内存泄漏....

我暂且抛砖引玉,有理解不对的,希望大家指出来。

1、在C语言中,当你 malloc一块新的内存后没有回收、创建的文件句柄没有关闭、创建的Socket描述符没有关闭....都会造成内存泄漏,所以一般情况下,在堆中开辟的内存不用后free掉,不用的文件句柄、Socket描述符Close掉,这样你的代码就很安全,也不会造成内存泄漏。

2、在C++ 语言中,与C语言中的一样上面的那些也会造成内存泄漏,上面的解决方案也可以解决掉内存泄漏。可是我们在C++中习惯用析构函数来释放资源,也就是说把一些free创建的内存、Close文件句柄操作放在析构函数中,如果在调用完后能正确的delete一个对象(当然对应的是new一个对象时的情况),或者栈能正常退出(对应的是在栈中创建对象,例如 WriteFile wf()),这样也能保证资源能完全释放。但是如果你调用在delete之前(或者说调用析构函数之前)调用了exit退出程序,那我负责地告诉你第一程序栈中的资源没有完全释放;第二在堆中创建的对象没有释放(假如你是把释放资源放在析构函数中的话)。因为调用exit是不执行对象的析构函数的。

下面举个例子:

Head.h文件

#include<iostream>
using namespace std;
class Head
{
public:
 Head()
 {
  printf("执行构造函数/n");
 }
 void Init()
 {
  _name=new char[100];
 }
 ~Head()
 {
  delete [] _name;
  printf("执行析构函数/n");
 }
private:
 char * _name;
};

 

test.cpp文件

#if defined(_DEBUG)
 #include <vld.h>
#endif
#include<stdlib.h>
#include "Head.h"

void End()
{
 //h->~Head();
 //delete h;
 printf("执行End函数..../n");
}
void f(Head * h)
{
    /*int *p = new int(0x12345678);
    printf("p=%08x, ", p);*/
 h->Init();
 //delete h;
 exit(1);

}

void main()
{
 Head * h= new Head();
 //atexit(End);
    f(h);
}
测试的结果:

Visual Leak Detector Version 1.0 installed (multithreaded DLL).
WARNING: Visual Leak Detector detected memory leaks!
---------- Block 61 at 0x00382BA0: 100 bytes ----------
  Call Stack:
    0x00411FEA (File and line number not available): (Function name unavailable)
    f:/dd/vctools/crt_bld/self_x86/crt/src/dbgmalloc.c (56): malloc
    0x00414EFE (File and line number not available): (Function name unavailable)
    0x004116FA (File and line number not available): (Function name unavailable)
    0x00411696 (File and line number not available): (Function name unavailable)
    0x004117DF (File and line number not available): (Function name unavailable)
    0x004154A8 (File and line number not available): (Function name unavailable)
    0x004152EF (File and line number not available): (Function name unavailable)
    0x7C82F23B (File and line number not available): ProcessIdToSessionId
  Data:
    CD CD CD CD    CD CD CD CD    CD CD CD CD    CD CD CD CD     ........ ........
    CD CD CD CD    CD CD CD CD    CD CD CD CD    CD CD CD CD     ........ ........
    CD CD CD CD    CD CD CD CD    CD CD CD CD    CD CD CD CD     ........ ........
    CD CD CD CD    CD CD CD CD    CD CD CD CD    CD CD CD CD     ........ ........
    CD CD CD CD    CD CD CD CD    CD CD CD CD    CD CD CD CD     ........ ........
    CD CD CD CD    CD CD CD CD    CD CD CD CD    CD CD CD CD     ........ ........
    CD CD CD CD                                                  ........ ........

---------- Block 59 at 0x00388C70: 4 bytes ----------
  Call Stack:
    0x00411FEA (File and line number not available): (Function name unavailable)
    f:/dd/vctools/crt_bld/self_x86/crt/src/dbgmalloc.c (56): malloc
    0x00411784 (File and line number not available): (Function name unavailable)
    0x004154A8 (File and line number not available): (Function name unavailable)
    0x004152EF (File and line number not available): (Function name unavailable)
    0x7C82F23B (File and line number not available): ProcessIdToSessionId
  Data:
    A0 2B 38 00                                                  .+8..... ........

Visual Leak Detector detected 2 memory leaks.
“内存泄漏检测工具.exe”: 已卸载“C:/WINDOWS/system32/dbghelp.dll”
“内存泄漏检测工具.exe”: 已卸载“C:/WINDOWS/system32/version.dll”
Visual Leak Detector is now exiting.
线程 'Win32 线程' (0x1f6c) 已退出,返回值为 1 (0x1)。
程序“[7628] 内存泄漏检测工具.exe: 本机”已退出,返回值为 1 (0x1)。

 

可以看到内存泄漏了

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
符号执行中的符号变量表示程序中的内存地址,符号内存就是指在符号执行过程中,用符号变量代替程序中的实际内存地址。符号内存可以用来发现程序中的内存相关漏洞,例如空指针引用、数组越界、内存泄漏等。 符号内存的主要问题在于,它会导致路径爆炸问题的加剧。由于符号内存的取值范围通常很大,符号执行需要对每个符号内存地址进行考虑,这会导致程序的执行路径数呈指数级别增长。此外,符号内存的处理还需要考虑指针的复杂语义,例如指针的动态分配和释放、指针的递归引用等等,这也会导致符号执行的计算复杂度变得非常高。 为了解决符号内存的问题,符号执行研究者提出了一些技术和方法,例如: 1.符号执行中的内存模型:为了简化符号内存的处理,符号执行可以采用一些简化的内存模型,例如基于语义的内存模型、基于类型的内存模型等等。 2.路径压缩技术:符号执行中的路径压缩技术可以减少路径爆炸问题的影响,例如基于路径约简的技术、基于路径合并的技术等等。 3.静态分析技术:符号执行可以结合静态分析技术,例如基于程序切片的技术、基于程序抽象的技术等等,来降低符号内存的计算复杂度。 4.约束求解技术:符号执行中的约束求解技术是符号内存处理的关键,可以采用一些高效的约束求解算法和数据结构,如基于位向量的算法、基于SMT求解器的算法等等。 综上所述,符号内存是符号执行中的一个重要问题,需要结合其他技术和方法来解决。在实际应用中,需要根据具体问题选择合适的技术,并进行优化和改进。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值