C语言使用GNU扩展实现简单智能指针

本文介绍了如何利用GNU/C的扩展功能实现简单的智能指针,通过变量作用域结束时自动调用函数来管理内存。文章详细解析了源码,解释了利用长度为0的数组作为可变长数组实现计数器,并讨论了智能指针的优缺点,包括源码体积、内联函数、手动引用计数和与普通指针的互操作性问题。
摘要由CSDN通过智能技术生成

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
  • 7
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值