问题是:您能否仅使用我在此问题底部提供的资源来帮助我更好地理解C语言(而非c ++)中的RAII宏?我试图在我的脑海中进行分析,以了解它的含义以及它的意义(在我看来这是没有意义的)。语法很难。问题的重点是:我在阅读和理解奇怪的语法及其在C语言中的实现方面遇到困难。 例如,我可以轻松阅读,理解和分析以下交换宏(对我来说很有意义):
#define myswap(type,A,B) {type _z; _z = (A); (A) = (B); (B) = _z;}
Run Code Online (Sandbox Code Playgroud)
(以下内容摘自本书:了解C指针)
GNU编译器使用C语言提供了非标准扩展来支持RAII。
GNU扩展使用一个名为RAII_VARIABLE的宏。它声明一个变量并与该变量关联:
当变量超出范围时执行的函数
宏如下所示:
Run Code Online (Sandbox Code Playgroud)#define RAII_VARIABLE(vartype,varname,initval,dtor) \ void _dtor_ ## varname (vartype * v) { dtor(*v); } \ vartype varname __attribute__((cleanup(_dtor_ ## varname))) = (initval)例:
Run Code Online (Sandbox Code Playgroud)void raiiExample() { RAII_VARIABLE(char*, name, (char*)malloc(32), free); strcpy(name,"RAII Example"); printf("%s\n",name); } int main(void){ raiiExample(); }
执行该功能时,将显示字符串“ RAII_Example”。不使用GNU扩展就可以达到类似的结果。
当然,您可以在不使用 RAII 的情况下实现任何目标。RAII 用例不必考虑显式释放资源。像这样的模式:
void f() {
char *v = malloc(...);
// use v
free v;
}
Run Code Online (Sandbox Code Playgroud)
需要你注意释放内存,否则就会出现内存泄漏。由于正确释放资源并不总是那么容易,RAII 为您提供了一种自动释放资源的方法:
void f() {
RAII_VARIABLE(char*, v, malloc(...), free);
// use v
}
Run Code Online (Sandbox Code Playgroud)
有趣的是,无论执行路径如何,资源都会被释放。因此,如果您的代码是意大利面条式代码,充满了复杂的条件和测试等,那么 RAII 可以让您释放释放的心思……
| 归档时间: |
|
| 查看次数: |
851 次 |
| 最近记录: |