Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.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_Debugging_Memory Leaks - Fatal编程技术网

C 防止依赖函数中的内存泄漏

C 防止依赖函数中的内存泄漏,c,debugging,memory-leaks,C,Debugging,Memory Leaks,首先,我甚至不知道如何解决这个问题,也不知道如何用谷歌搜索解决方案,所以如果你有一个更好的标题来更好地描述我的问题,那就太好了 简介:我目前正在学校为一个项目开发C代码,这个项目不是很雄心勃勃,但我想用正确的方式来完成。该项目是一个关于硬件密码管理器的项目 该项目的一个部分是,如果在X秒内没有收到任何输入,则设备会自动锁定。我计划通过定时器和中断来实现这一点,因为我正在研究微芯片,但这与这里真正的问题没有什么关系 我最初的设计是,在主功能中调用函数锁,以便设备启动锁定,一旦提供了正确的PIN,就

首先,我甚至不知道如何解决这个问题,也不知道如何用谷歌搜索解决方案,所以如果你有一个更好的标题来更好地描述我的问题,那就太好了

简介:我目前正在学校为一个项目开发C代码,这个项目不是很雄心勃勃,但我想用正确的方式来完成。该项目是一个关于硬件密码管理器的项目

该项目的一个部分是,如果在X秒内没有收到任何输入,则设备会自动锁定。我计划通过定时器和中断来实现这一点,因为我正在研究微芯片,但这与这里真正的问题没有什么关系

我最初的设计是,在主功能中调用函数锁,以便设备启动锁定,一旦提供了正确的PIN,就会在锁定范围内调用函数主菜单。但是,主菜单有一个while1{some code},它从不返回任何内容,因为它不需要返回。但是,下次用户使用AFK时,将触发中断并调用锁,从而有效地保存主菜单的程序计数器。一旦用户输入正确的PIN码,lock将调用MainMenu。换句话说,函数A将调用函数B,函数B将再次调用A,依此类推

看到问题了吗?我将永远保存至少在PC机上永远不会使用的局部变量。我在设计上做了一些调整,解决了这个问题。然而,问题依然存在

有没有一种方法可以在不保存当前环境的情况下调用函数

函数的循环模型是一个真正的问题,还是可以通过设计一个好的模型然后实现它来解决?如果是,开发人员使用什么样的解决方案


编辑1:一条评论建议休息。这不是我想要的,因为问题不在循环中,而是在两个相互调用的函数中。另一条评论建议使用setjmp和longjmp。如果要保存当前运行的环境,我认为这些函数非常有用。然而,在我的情况下,恰恰相反,我不想拯救我所处的环境

状态机听起来不错,而且很复杂。下面的设计稍微简单一点。我会这样做:

/* locks screen
 *
 * Function does not return until valid keys for unlock have been entered.
 */
void lockScreen();

/* prints menu (may consider choice to highlight resp. item)
 */
void printMenu(int choice);

/* reads from keyboard
 *
 * returns: < 0 ... timeout
 *          >= 0 ... selected menu item
 */
int keyInput();

/* main function */
int main()
{
  int lastChoice = -1;
  for (bool lock = 1;;) { /* never ending run-time loop */
    if (lock) { lockScreen(); lock = 0; }
    printMenu(lastChoice);
    int choice = keyInput();
    switch (choice) {
      /* regular choices */
      /* exit required?
      case 0: return 0;
       */
      case 1: /* do 1st command */ break;
      case 2: /* do 2nd command */ break;
      default: /* should not happen */ break;
      /* timeout */
      case -1: lock = 1;
    }
    if (choice >= 0) lastChoice = choice;
  }
}
注:

请考虑这不是素描。由于提问者没有公开预期平台的代码或具体细节,我试图笼统地回答这个问题

锁屏也可以使用按键输入。因此,可以收集密钥,直到它们形成一个完整的密码,该密码可能是正确的,也可能是错误的。超时可用于重置不完整的密码


请压缩并显示一些代码。你是在寻找一个考虑循环而不是递归的吗?也许SETJMP和LangJMP是你所要寻找的。这个问题和C++有什么关系?这就是我决定采取的方法。