现在的位置: 首页 > 综合 > 正文

C++技巧之栈变量的析构应用

2017年12月17日 ⁄ 综合 ⁄ 共 1979字 ⁄ 字号 评论关闭

栈变量有一个好处,就是它退栈时会自动析构,并且在栈上对象生成比在堆上分配效率高很多。但每个线程的栈空间是有限的(创建线程时可以设置),所以一般的临时小对象都会在栈上分配。

上述的例子,stack_var与stack_var2都是一个栈变量,当然stack_var与stack_var2谁先从栈中分配,不的操作系统,内存管理方式也略有区别。更深一点讲,heap_var这个指针值也是一个栈变量承载,但heap_var所指的地址内容才是从堆上分配的内存空间。当退出test这个函数时,stack_var与stack_var2都会先调用Test的析构,再把其所在的内存空间回收到线程栈中。

在一些场景下,我们可以利用栈变量当退栈时会自动析构这特性,下面我将举两个应用例子。

1.从堆上面new出来的对象,在一个方法条件分支比较多的情况下,很容易在某个分支少写delete,就会造成内存的泄漏。于是我们可写一个这样的类,在它的析构方法中调用delete回收内存。

使用方式如下:

 

2.做软件,写debug日志是一个好的习惯,出问题时可以方便定位问题的发生源。下面的例子是实现是能记录函数在哪一行进入,在哪一行退出。如果函数某个地方抛异常了,则可以根据进入行与退出行相同一看便知。没有抛异常,也很方便查出是在哪个分支退出的。

上述的__FUNCTION__,__FILE__与__LINE__是编译期间的宏,是一个字符串常量,分别表示函数名,文件名与当前行数。但__FUNCTION__并非标准中定义的,各个编译器命名不同,更通用的宏可以使用boost中BOOST_CURRENT_FUNCTION。其中的__FUNC_TRACE__宏开关表示是否编译时开启函数跟踪。

使用方式如下:

抱歉!评论已关闭.