防止相关功能中的内存泄漏[关闭]
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了防止相关功能中的内存泄漏[关闭]相关的知识,希望对你有一定的参考价值。
首先,我甚至不知道如何解决这个问题,也不知道如何谷歌解决它,所以如果你有一个更好的标题,更好地描述我的问题,那将是伟大的。
简介:我目前正在为学校的项目开发C代码,该项目并不是真的雄心勃勃,但我想以正确的方式。该项目是一个关于硬件密码管理器。
该项目的一个部分是如果在X秒内没有收到任何输入,则设备锁定自身的功能。我打算通过计时器和中断来实现这个目标(因为我正在研究微芯片),但这与这里真正的问题没什么关系。
我的初始设计是,在main()
函数中调用函数lock()
,因此设备启动锁定,一旦提供了正确的PIN,就调用函数MainMenu()
(在lock()
范围内)。然而,MainMenu()
有一个while(1) { some code }
,它永远不会返回任何东西,因为它不需要。但是,下次用户AFK时,将触发中断并调用lock()
,从而有效地保存了MainMenu()
的程序计数器。一旦用户输入正确的PIN,lock()
将调用MainMenu()
。换句话说,函数A
将调用函数B
,它将再次调用A
,依此类推。
看到问题?我将永远保存永远不会使用的局部变量(至少是PC)。我已经通过设计中的一些调整解决了这个问题。但问题仍然存在。
- 有没有办法调用函数而不保存我当前的环境?
- 有一个循环的函数模型是一个真正的问题,还是可以通过设计一个好的函数然后实现它来解决?如果是这样,开发人员使用什么样的解决方案?
编辑1:一条评论建议break
。这不是我想要的,因为问题不在循环中,而是在2个函数中相互调用。另一条评论建议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()
。因此,可以收集密钥,直到它们形成完整的密码(可能是正确的或错误的)。超时可用于重置不完整的密码。
以上是关于防止相关功能中的内存泄漏[关闭]的主要内容,如果未能解决你的问题,请参考以下文章