【问题标题】:Free a single-use variable after returning it返回后释放一次性变量
【发布时间】:2019-04-16 11:09:31
【问题描述】:

我有一个应该在 Windows 控制台上侦听输入的函数。它使用 conio.h。它每秒会被调用大约 20 次。

我怎样才能防止我的记忆被堵塞?据我了解C,它每次都会初始化一个新的字符。我不能使用单个公共内存位置。该函数必须是完全自封装的。

除了返回内存地址并调用free(*adress)之外,还有没有更简单的方法可以在返回内存后从内存中删除in

代码:

#include <conio.h>

// Passively listen for input, return char if input, else 0
char listen() {
    char in = 0;

    if (kbhit()) { // Some key was pressed
        in = getch(); // Which key?
    }

    return in;
}

void forward(void);

// Usage, for instance control a figure in a game
void main(void) {
    while (game) {
        char input = listen()

        if (input == 'w')
            forward();
    }
}

【问题讨论】:

  • 编译器很聪明,它们不会在每次调用函数时分配内存,它只重用旧内存(在这种情况下是堆栈)。因此,无论调用多少次函数,如果它本身没有显式分配内存,那么您的内存使用量应该是固定的和静态的。
  • 没有问题:char in 是一个局部变量,因此将存储在堆栈中,并在函数返回时自动“释放”。所以你不必担心。
  • 你的内存不会被上面的代码“堵塞”。当函数返回时,函数listen 中的变量存储将消失。 main 中的 while 循环中的 input 变量将在每次循环中重复使用。

标签: c memory-management scope lifetime


【解决方案1】:

有没有更简单的方法可以在返回后从内存中删除

您不必担心,对于具有块作用域和自动存储期限的变量,一旦作用域结束,它们的生命周期也结束,内存可以自动回收。作为程序员,您无需采取任何额外的操作。

也就是说,任何半体面的编译器都会将代码优化为如下所示,以避免使用任何临时变量。

char listen() {

    if (kbhit()) { // Some key was pressed
        return getch(); // Which key?
    }
   return 0;
}

也就是说,getch() 返回一个 int,因此您最好将 listen() 函数的返回类型也更改为返回一个 int 值。

【讨论】:

    猜你喜欢
    • 2014-11-25
    • 2011-01-18
    • 2020-05-06
    • 1970-01-01
    • 2019-10-29
    • 2015-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多