9

方案一:

 library(pryr)

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

输出例如:

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

方案二:

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 的值是在变化的,但是为什么地址也发生了变化呢?当 for 循环运行大约 500,000,000 次而在循环期间不调用 gc 时,这会导致内存泄漏吗?

4

1 回答 1

2

正如@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
于 2017-09-17T04:03:18.927 回答