C 如何知道函数是否将在最后一次调用
我正在为一个学校项目做一个自制的malloc()、realloc()和free() 我想知道是否有办法让我的函数free()知道这是否是他在程序中的最后一次调用 编辑:我没有控制main(),它是用于库的 我想使用sbrk()在最后只释放一次,因为现在我称它为free(),但它没有得到优化 (我删除了这段代码,因为我不想受到学校的打击)C 如何知道函数是否将在最后一次调用,c,C,我正在为一个学校项目做一个自制的malloc()、realloc()和free() 我想知道是否有办法让我的函数free()知道这是否是他在程序中的最后一次调用 编辑:我没有控制main(),它是用于库的 我想使用sbrk()在最后只释放一次,因为现在我称它为free(),但它没有得到优化 (我删除了这段代码,因为我不想受到学校的打击) 看来这是不可能的。。谢谢您的回复。不,通常无法知道函数是否在程序执行中最后一次被调用 一个程序可以通过传递一个参数来传达这一知识。您必须将其构建到调用链中的所有
看来这是不可能的。。谢谢您的回复。不,通常无法知道函数是否在程序执行中最后一次被调用 一个程序可以通过传递一个参数来传达这一知识。您必须将其构建到调用链中的所有函数中。即使如此,它也可能导致某些代码变得笨拙,因为某些循环的最后一次迭代可能需要特殊处理 一般来说,最好在适当的时候调用单独的清理代码,而不是试图以您似乎正在尝试的方式将其自动合并到日常操作中。不,您不能 例如:
- 每当用户单击“确定”时,GUI将调用您的函数
- 程序无法知道用户是否会再次单击或单击后关闭计算机
要实现您想要的功能,唯一可能的方法是让function free()中止整个程序,这样您就可以确定它不会被再次调用。不,正如其他答案所述,这是不可能的 您可以做的最接近的事情是注册一个
atexit
处理程序来执行您想要执行的任何清理:
static int init = 0;
void cleanup()
{
// last call to sbrk to clean up
}
void *my_malloc(size_t size)
{
if (!init) {
init = 1;
atexit(cleanup);
}
...
}
你想用这些知识实现什么?听起来相当于停顿问题。不确定你在问什么,或者为什么你需要知道。你的意思是如果你有
free();如果(rand()%2)free()
第一个free()
应该知道第二个是否会被调用?知道“最后一个潜在调用”实际上毫无价值——要么清理代码有时不会被调用,这会导致难以调试的bug,要么如果清理代码有时不被调用并不重要,为什么要包括它?@JJJ更糟糕的是,如果“最后一次呼叫”没有包括呢?例如,使用atexit()
注册的exit()
处理程序在假定的“最后一次”调用之后调用free()
。