“分配上下文”是什么?

10
我是一名学生,我需要研究内存泄漏检测。在很多论文中,他们提到了分配上下文。我不知道它是什么意思。我找不到分配上下文的定义(或翻译,我来自德国)。
例如,来自一篇论文(通过使用机器学习进行内省动态行为建模检测内存泄漏)的引用:
“使用机器学习的关键思想是,通过观察其他类似对象的生命周期,可以区分出泄漏对象。也就是说,在其他被认为是相似对象(即具有相同分配上下文的对象)中没有观察到高度陈旧的对象可以被视为已经泄漏。”
或者:
“为了解决这个问题,本研究借鉴了以前关于对象生命周期预测的研究[4,20]。根据这些工作,对象的生命周期与其分配上下文密切相关。由于对象的陈旧性受其生命周期的限制,因此对象的陈旧性与分配上下文具有传递相关性。”
能否有人尽可能简单地向我解释一下?
编辑:
摘要:
这篇论文通过提出一个基于机器学习的框架,扩展了基于陈旧度的内存泄漏检测。提出的框架基于这样一个想法:在对象的相似性方面,对象的陈旧程度可以更好地利用;也就是说,如果一个对象显示出明显较高的陈旧程度,并且其他具有相同分配上下文的类似对象中没有发现,则该对象更有可能已经泄漏。所提出的框架的核心部分是堆对象的建模。为此,该框架观察应用程序的代表运行时对象的陈旧度。从观察到的数据中,该框架生成训练示例,其中还包含假设泄漏的实例。通过机器学习,所提出的框架将以前研究中使用的容易出错的用户定义陈旧谓词替换为基于模型的预测。该框架已经通过合成和真实世界的例子进行了测试。使用SPEC2006基准测试的合成泄漏工作负载评估表明,所提出的方法实现了基于陈旧度的泄漏检测允许的最佳精度。此外,通过将分配上下文纳入模型中,所提出的方法实现了比仅使用对象陈旧度更高的精度。与真实世界内存泄漏的评估表明,所提出的方法能够高准确率地检测先前报告的错误。

2
我不知道“allocation context”这个词组的具体定义。例如,在C标准中没有出现过这个短语。我认为你只能从作者使用这个短语的上下文中推断它的意思。那篇论文有定义这个术语吗? - Keith Thompson
好的,我已经尝试从上下文中找出“allocation context”可能意味着什么,但没有成功。作者没有定义这个术语。:/ 我已经添加了摘要,在那里这个术语第一次出现。也许这会有所帮助。 - m.w.
这可能是内存泄漏检测领域中已经确立的术语。查阅参考资料可能会有所帮助。 - molbdnilo
很遗憾,我已经搜索了所有关于“分配上下文”关键字的参考资料,但没有找到相关信息。 - m.w.
3个回答

7

我收到了一位作者的回复。定义如下:

分配上下文

它是指在分配时刻调用堆栈中的内容。 例如,如果一个分配位置包含在函数foo中,并且该函数从main中调用(在执行期间),则该分配位置的分配上下文为(main,main:call@foo,foo:malloc(...))。


6

考虑这样的C语言示例:

#include <stdlib.h>

void function_which_allocates(void) {
    /* allocate an array of 45 floats */
    float *a = malloc(sizeof(float) * 45);

    /* additional code making use of 'a' */

    /* return to main, having forgotten to free the memory we malloc'd */
}

int main(void) {
    function_which_allocates();

    /* the pointer 'a' no longer exists, and therefore cannot be freed,
     but the memory is still allocated. a leak has occurred. */
}
< p > a的分配上下文是function_which_allocates函数。

因此,变量的分配上下文是该变量的作用域

如果超出了作用域,就不能释放该内存,这会导致内存泄漏。


2
你的解释没有意义。分配上下文是已分配的内存块的属性,而作用域是指向它的变量的属性。这两者是正交的。 - user541686

0

我相信它只是指“分配时的上下文”。

换句话说,您可以将其视为“程序可观察状态在分配发生时”的意思——即调用堆栈、本地变量等。


1
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Adam Stelmaszczyk
请注意,我之前说的是“可观察状态”,这是有原因的。内存分配通常被视为纯操作(即无副作用),因为通常很难观察到其副作用,而且你通常也不想要观察到。 (唯一真正的方法是耗尽内存。)分配后唯一其他不同的可观察状态是指向分配块的额外变量,在这里我们可以忽略它,因为此时它未使用且与程序的其余部分无关。(另外,恶意的投票行为并不能改变事实。) - user541686

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接