Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何知道函数是否将在最后一次调用_C - Fatal编程技术网

C 如何知道函数是否将在最后一次调用

C 如何知道函数是否将在最后一次调用,c,C,我正在为一个学校项目做一个自制的malloc()、realloc()和free() 我想知道是否有办法让我的函数free()知道这是否是他在程序中的最后一次调用 编辑:我没有控制main(),它是用于库的 我想使用sbrk()在最后只释放一次,因为现在我称它为free(),但它没有得到优化 (我删除了这段代码,因为我不想受到学校的打击) 看来这是不可能的。。谢谢您的回复。不,通常无法知道函数是否在程序执行中最后一次被调用 一个程序可以通过传递一个参数来传达这一知识。您必须将其构建到调用链中的所有

我正在为一个学校项目做一个自制的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()