C语言使用GNU扩展实现智能指针
GNU/C有一个__attribute__
扩展叫cleanup
:
https://gcc.gnu.org/onlinedocs/gcc-4.6.2/gcc/Variable-Attributes.html#Variable-Attributes
它的作用是:当某个变量出了它的作用域的时候,自动执行绑定的某个函数
这个出作用域,可以是跑出大括号,也可以是其他行为
它可以有很多用途,取决于程序员的想象力,但是最直白的、最容易想到的,还是实现一个像C++里一样的智能指针
这里有一份我已经写好的“智能指针”,为了方便使用,写成了头文件
它的使用方式很简单:
void* test()
{
printf("start test\n");
autoptr_def(void*, ptr);
autoptr_new(ptr, sizeof(int) * 20);
autoptr_new(ptr, sizeof(int) * 200);
printf("end test\n");
return autoptr_cpy(ptr);
}
int main()
{
printf("into main\n");
autoptr_def(void*, ptr);
ptr = test();
printf("check\n");
}
使用mtrace进行检测,增加两个函数:
__attribute__((constructor))
void before_main()
{
mtrace();
printf("trace start\n");
}
__attribute__((destructor))
void at_exit()
{
printf("trace end\n");
muntrace();
}
,产生的log文件如下:
= Start
@ /lib/x86_64-linux-gnu/libc.so.6:(_IO_file_doallocate+0x94)[0x7fe03d802e84] + 0x5642e5ec9690 0x400
@ ./a.out:[0x5642e5940284] + 0x5642e5ec9aa0 0x58
@ ./a.out:[0x5642e59402c8] - 0x5642e5ec9aa0
@ ./a.out:[0x5