3
回答完大约tracemem
recently后,我了解了retracemem
。 ?retracemem
的帮助和其中的例子让我无法理解。在R中`retracemem`做什么?
retracemem
实际上做了什么,为什么?它不会做我认为它会做的事情,即将一个对象指向另一个对象的内存位置,至少据我所知。
我尝试了wizardly调用像.Internal(inspect())
,这对我来说没有执行魔法:
> a = 1:10
> b = a[-1]
> .Internal(inspect(a))
@00000000087AE578 13 INTSXP g0c4 [NAM(2)] (len=10, tl=23336) 1,2,3,4,5,...
> .Internal(inspect(b))
@00000000087AE8E8 13 INTSXP g0c4 [NAM(2)] (len=9, tl=7208) 2,3,4,5,6,...
> retracemem(b,retracemem(a))
> .Internal(inspect(b))
@00000000087AE8E8 13 INTSXP g0c4 [NAM(2)] (len=9, tl=7208) 2,3,4,5,6,...
我一定要密实。我的一个解释是,分配G时没有消息打印的事实表明F的分配破坏了跟踪。后来,在做第二次G赋值时,tracemem或retracemem似乎给出了相同的后续行为。在这种情况下,它看起来像是一样的。我不确定在这种情况下我们如何从'retracemem'中受益。必须有一些我错过了。 – Iterator
我查看了'do_tracemem()'和'do_retracemem()'的来源。他们之间似乎没有太大的区别。 'do_retracemem()'标记要跟踪的新对象(和'do_tracemem()'一样),然后吐出一行显示新对象和前一个对象之间的链接,然后打印出我假设的是函数调用列表(除非在函数调用中调用'retracemem()',否则不会看到这个函数)。我认为这只是当你想在不安情况下连接内存使用起源的桥梁。 – Zach
我也查看了代码(在'debug.c'中,对不对?),并得出了类似的结论。代码没有记录和未注释时,我喜欢它。虽然这个小小的评论很有趣:'/ * FIXME:...' - 我认为这是一个无害的问题,但它最初引人注目。感谢您抽出宝贵时间来了解这些信息和见解。 – Iterator