c - 防止相关函数中的内存泄漏

标签 c debugging memory-leaks

关闭。这个问题需要更多 focused .它目前不接受答案。












想改进这个问题?更新问题,使其仅关注一个问题 editing this post .

4年前关闭。




Improve this question




首先,我什至不知道如何解决这个问题,也不知道如何在谷歌上找到解决方案,所以如果你有一个更好的标题来更好地描述我的问题,那就太好了。

简介:我目前正在为学校的一个项目开发 C 代码,该项目并不是很雄心勃勃,但我希望以正确的方式进行。该项目是关于硬件密码管理器的。

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

我最初的设计是在 main()函数调用函数lock()因此设备启动锁定,一旦提供正确的 PIN,功能 MainMenu()被调用(在 lock() 范围内)。但是,MainMenu()有一个 while(1) { some code }它永远不会返回任何东西,因为它不需要。但是,下次用户AFK时,会触发中断,lock()将被调用,有效地保存 MainMenu() 的程序计数器.一旦用户输入正确的 PIN,lock()将调用 MainMenu() .换句话说,函数 A将调用函数B这将再次调用 A等等。

看到问题了吗?我将永远保存永远不会使用的局部变量(至少是 PC)。我已经通过设计中的一些调整解决了这个问题。但是,问题仍然存在。

  • 有没有办法在不保存我所在的当前环境的情况下调用函数?
  • 有一个函数的循环模型是一个真正的问题,还是可以通过设计一个好的模型然后实现它来解决?如果是这样,开发人员使用什么样的解决方案?

  • 编辑1:建议一条评论break .这不是我想要的,因为问题不在循环内部,而是在两个相互调用的函数中。另一条评论建议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;
      }
    }
    

    备注:
  • 请将此视为草图(而不是 MCVE )。由于提问者没有公开预期平台的代码或具体细节,我试图“笼统地”回答这个问题。
  • lockScreen()可以使用 keyInput()也是。因此,可以收集 key ,直到它们形成完整的密码(可能正确或错误)。超时可用于重置不完整的密码。
  • 关于c - 防止相关函数中的内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47916397/

    相关文章:

    python - 调试 Python/NumPy 内存泄漏

    c - 如何在 C 中从/到不同的架构运行代码?

    c - 如何将服务器中的一些数据写入连接到我的服务器的所有客户端?

    c - 锁定 Linux 串口

    android - 如何在 android chromium 中启用日志记录?

    java - com.sun.imageio.plugins.jpeg.JPEGImageReader 泄漏

    java - 内存泄漏 - android.os.Message 持有的 Android Activity

    c - 来自缓冲区的 scanf 无法正常工作

    asp.net - 无法调试 ASP 应用程序中的某些 aspx 页面

    api - 如何在golang中调试特定的api?