为什么循环变量的地址在使用时会发生变化?

Why is the address of a loop variable changing when using it?

计划 1:

 library(pryr)

 for (x in 1:3) {
     print(c(address(x), refs(x)))
 }

输出例如:

[1] "0x7a6a6c8" "1"        
[1] "0x7a6a6c8" "1"        
[1] "0x7a6a6c8" "1"

计划 2:

library(pryr)

for (x in 1:3) {
  print(c(address(x), refs(x)))
  print(x)
}

输出例如:

[1] "0x7ae0298" "1"        
[1] 1
[1] "0x7ae88c8" "1"        
[1] 2
[1] "0x7af2668" "1"        
[1] 3

很明显程序2中x的值在变,为什么地址也变了呢?当循环期间没有调用 gc 时,for 循环 运行 大约 500,000,000 次是否会导致内存泄漏?

如@alexis_laz 所述,在循环末尾使用 print(x) 将其标记为多重引用。由于 R 是一种动态语言,因此很容易发生这种情况。为了测试这个效果,我们可以打印 refs(x), print(x), refs(x):

的输出
for (x in 1:3) {
  print(refs(x))
  print(x)
  print(refs(x)); cat("\n")
}

输出:

[1] 1
[1] 1
[1] 2

[1] 1
[1] 2
[1] 2

[1] 1
[1] 3
[1] 2