闵行网站建设推广,海外人才招聘网站,做安全防护信息的网站,电子商务网站推广的主要方法简述
什么是RAII
RAII#xff08;Resource Acquisition Is Initialization#xff09;是c之父Bjarne Stroustrup提出的概念。资源一般分三个步骤#xff1a;获取、使用和销毁#xff0c;而在自由使用内存的c语言中#xff0c;资源的销毁常常是程序员容易遗漏的事情…简述
什么是RAII
RAIIResource Acquisition Is Initialization是c之父Bjarne Stroustrup提出的概念。资源一般分三个步骤获取、使用和销毁而在自由使用内存的c语言中资源的销毁常常是程序员容易遗漏的事情让程序自动销毁资源也成为了业界的常规方案。
c实现
#define RAII_FREE(FreeFunc) __attribute__((cleanup(FreeFunc)))以上代码使用了编译属性__attribute__在函数退出后自动回收资源使用方式如下
void MemFreeL2PointerAndSetNull(void *ptr)
{void **pptr (void **)ptr;free(*pptr);
}void TestFunc()
{/* 入参是析构函数在malloc资源时也指定free要使用的函数尽量不在宏中写函数减少后续定位的复杂度并且也满足malloc和free的配对出现可读性更好 */RAII_FREE(MemFreeL2PointerAndSetNull) TestObj *obj (TestObj *)malloc(sizeof(TestObj));obj-grade 1;
}考虑到__attribute__是编译属性笔者调研了几款常见编译器支持程度如下
编译器是否支持参考GCC支持https://gcc.gnu.org/onlinedocs/gcc/Common-Variable-Attributes.htmlClang支持https://clang.llvm.org/docs/AttributeReference.htmlMSVC不支持可以通过 _try 和 _finally 关键字实现类似的功能https://learn.microsoft.com/en-us/cpp/c-language/try-finally-statement-c?viewmsvc-170
扩展
智能指针FreeFunc中加入引用技术则可实现c中的智能指针功能
参考
RAII in C: cleanup gcc compiler extension