gpt4 book ai didi

c - C中栈变量的自动释放

转载 作者:太空狗 更新时间:2023-10-29 16:22:08 26 4
gpt4 key购买 nike

不幸的是,在 C 中没有任何智能指针..但是是否有可能构建一个宏来包装变量声明并在离开声明变量的范围时使用该变量作为输入变量调用函数调用?

很抱歉说了这么长的话,但我正在研究 xnu 内核,其中有许多元素具有内置的引用计数器,并且在使用完后一定不要忘记取消引用该元素以避免内存泄漏。

例如,如果我有以下类型的 proc_t:

struct proc;
typedef struct proc * proc_t;

我想在一个范围内声明一个基于此类型的堆栈变量,例如:

{
proc_t_release_upon_exit proc_t proc_iter = proc_find(mypid);
//the rest of the code in this scope
}

在预处理器分析宏之后和编译之前,我希望生成以下代码:

{ 
proc_t myproc = proc_find(mypid)
//the rest of the code in scope
proc_rele(myproc);
}

有没有办法像在 C 中定义这样的宏?

最佳答案

您可以在 GCC 中使用 cleanup 变量属性。请看看这个: http://echorand.me/site/notes/articles/c_cleanup/cleanup_attribute_c.html

示例代码:

#include <stdio.h>
#include <stdlib.h>

void free_memory(void **ptr)
{
printf("Free memory: %p\n", *ptr);
free(*ptr);
}

int main(void)
{
// Define variable and allocate 1 byte, the memory will be free at
// the end of the scope by the free_memory function. The free_memory
// function will get the pointer to the variable *ptr (double pointer
// **ptr).
void *ptr __attribute__ ((__cleanup__(free_memory))) = malloc(1);
return 0;
}

如果将源代码保存在名为 main.c 的文件中,则可以使用以下命令对其进行编译:

gcc main.c -o main

并通过以下方式验证是否存在任何内存泄漏:

valgrind ./main

valgrind 的示例输出:

==1026== Memcheck, a memory error detector
==1026== Copyright (C) 2002-2013, and GNU GPL'd, by Julian Seward et al.
==1026== Using Valgrind-3.10.1 and LibVEX; rerun with -h for copyright info
==1026== Command: ./main
==1026==
Free memory: 0x51ff040
==1026==
==1026== HEAP SUMMARY:
==1026== in use at exit: 0 bytes in 0 blocks
==1026== total heap usage: 1 allocs, 1 frees, 1 bytes allocated
==1026==
==1026== All heap blocks were freed -- no leaks are possible
==1026==
==1026== For counts of detected and suppressed errors, rerun with: -v
==1026== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)

关于c - C中栈变量的自动释放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44819409/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com