在我的程序中,我使用的是静态变量(没有其他办法),问题是它需要在退出时自由。
如果不将此变量声明为全局,我将如何实现这一目标?
我在想atexit
函数,但它似乎无法进行论证。难道没有传递变量的技巧吗?
感谢。
答案 0 :(得分:3)
不确定它是否符合您的要求,但我会将静态变量设置为文件范围静态,在一个源文件中关闭,如下所示:
static char *my_static_variable = NULL;
static void my_cleanup_function()
{
free(my_static_variable);
}
void my_initialization_function()
{
my_static_variable = malloc(10);
atexit(my_cleanup_function);
}
也就是说,my_static_variable
和my_cleanup_function
仅在该一个源文件中可见;它们不是程序范围的全局变量。
但是,作为旁注,在退出时释放malloc内存通常不需要 。实际上,当您释放过程使用的内存时,操作系统会自动为您分配任何内容。
答案 1 :(得分:1)
我认为解决此问题的更好方法是使用on_exit
函数而不是atexit
函数。
请参阅相关手册页 - http://man7.org/linux/man-pages/man3/on_exit.3.html
答案 2 :(得分:0)
如果不将此变量声明为全局变量,我将如何实现这一目标?
static
存储类变量是全局变量 - 它们不会导出到链接器,因此它们只能在同一个转换单元中引用。
我在考虑
atexit
函数,但它似乎无法进行论证。没有任何技巧可以传递我的变量吗?
是。只需使用atexit
注册处理程序:
static void* foo = NULL;
static void handler () {
free(foo);
}
...
atexit(handler);
如果你要退出,你真的不需要free
记忆。系统将清理它。此外,无法保证将调用您的atexit
处理程序(例如SIGKILL)。
答案 3 :(得分:0)
我认为通过“global”,你的意思是你不想使用带有文件范围的变量,而“static”你指的是函数中的静态局部变量,而不是其他19个含义中的一个。这个单词。你没有提供足够的上下文,因为毫无疑问是一个更清晰的解决方案,但你可以在声明这个变量的函数中添加一个参数,并执行以下操作:
<Button x:Name="btnPlay" Content="Play" Canvas.Left="93" Canvas.Top="93" Width="183"
Click="button_Click" Height="84" FontFamily="Showcard Gothic" Cursor="Hand"
BorderBrush="{x:Null}">
<Button.Background>
<ImageBrush ImageSource="/WpfApplication1;component/5.png" />
</Button.Background>
<Button.Template>
<ControlTemplate TargetType="Button">
<Border Name="border" Background="{TemplateBinding Background}"> <!--Consider this-->
<ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" />
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Background">
<Setter.Value>
<ImageBrush ImageSource="/WpfApplication1;component/5.png" />
</Setter.Value>
</Setter>
<Setter Property="BorderBrush" Value="Black"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Button.Template>
</Button>
总是使用exit_flag == 0调用foo,但在设置exit_flag时退出处理程序除外。