计划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
显然,x的价值在计划2中正在发生变化,但为什么地址也会发生变化?当循环运行大约500,000,000次而循环期间没有调用gc时,这会导致内存泄漏吗?
在循环的末尾打印(x)将其标记为多引用,如@alexis_laz所述。由于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