为什么循环变量的地址在使用时会发生变化?
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
计划 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