表达式计算器内存泄漏风险的规避

程序运行过程中栈和堆的概念,栈是程序运行过程中,程序为局部变量分配的内存,如int a = 2,可以实现自行销毁;堆是程序员控制分配的内存 int *p = malloc(int),必须由程序员进行控制销毁。

资源管理相关概念:

栈上分配的对象,生命周期结束时,会由编译器自动执行释放操作。

当一个对象内部嵌入另一个自动对象,调用外部对象的析构函数时,会自动调用内部的析构函数。

堆上分配的对象,由程序员控制其内存释放,如果未执行释放,易导致内存泄漏。操作系统可能执行响应的内训释放操作。

动态分配的对象,由指针进行控制,但是多个指针可能指向同一个对象,比如int *p= new int, *p1=p,*p2=p;此时如果冒然删除p,则可能导致p1,p2成为空悬指针,此时使用这种指针,进会出现运行为错误

动态对象管理不当,可能引起内存泄漏,空悬指针,重复删除等错误。

一个对象可以拥有资源,在对象的构造函数中执行资源的获取(指针的初始化),在析构函数中释放。这种技法把它称之为RAII(Resource Acquisition Is Initialization)

 

资源包括,指针,文件句柄,套接字,互斥量,信号量等。

默认的析构函数是内联函数,如果一个头文件中有一个类是前项说明,不含有具体的定义,那么如果采用默认的析构函数,就没办法调用前项声明的类的析构函数。

 

posted @ 2017-04-02 09:47  冥地魔王  阅读(224)  评论(0)    收藏  举报