在Go中,删除指针映射的条目会导致内存泄漏吗?

2023-12-07

第一次来到这里,

首先NOTE in 切片技巧表明在剪切或删除指针切片中的元素时存在潜在的内存泄漏问题。

地图也是如此吗?例如:https://play.golang.org/p/67cN0JggWY

在从地图中删除之前我们应该清零该条目吗?就像这样:

m["foo"] = nil

如果我们简单地clear地图?

m = make(map[string]*myStruct)

垃圾收集器还会捡起来吗?

提前致谢


检查来源

尽管这在任何地方都没有记录,但请检查来源:runtime/hashmap.go, mapdelete()功能:

558 func mapdelete(t *maptype, h *hmap, key unsafe.Pointer) {
        // ...
600             memclr(k, uintptr(t.keysize))
601             v := unsafe.Pointer(uintptr(unsafe.Pointer(b)) + dataOffset + bucketCnt*uintptr(t.keysize) + i*uintptr(t.valuesize))
602             memclr(v, uintptr(t.valuesize))
        // ...
618 }

如您所见,键(第 #600 行)和值(第 #602 行)的存储都被清除/清零。

这意味着如果任何键或值是指针,或者它们是包含指针的复杂类型的值,它们将被归零,因此指向的对象不再被映射的内部数据结构引用,因此没有内存这里泄漏。

当没有更多参考完整的map值,则完整的内存区域map将被垃圾收集,并且键和值中包含的所有指针也不再由映射保存;如果没有其他人引用这些指向的对象,它们将被正确地垃圾收集。

构造一个例子来证明这一点

我们还可以构建一个测试代码来证明这一点,而无需检查来源:

type point struct {
    X, Y int
}

var m = map[int]*point{}

func main() {
    fillMap()
    delete(m, 1)
    runtime.GC()
    time.Sleep(time.Second)
    fmt.Println(m)
}

func fillMap() {
    p := &point{1, 2}
    runtime.SetFinalizer(p, func(p *point) {
        fmt.Printf("Finalized: %p %+v\n", p, p)
    })
    m[1] = p
    fmt.Printf("Put in map: %p %+v\n", p, p)
}

输出(尝试一下去游乐场):

Put in map: 0x1040a128 &{X:1 Y:2}
Finalized: 0x1040a128 &{X:1 Y:2}
map[]

这是做什么的?它创建了一个*Pointvalue(指向结构体的指针),将其放入映射中,并注册一个函数should当该指针变得无法访问时调用(使用runtime.SetFinalizer()),然后删除包含该指针的条目。然后我们打电话runtime.GC()“强制”立即进行垃圾收集。我还在最后打印地图,只是为了确保整个地图不会由于某些优化而被垃圾收集。

结果?我们看到注册的函数被调用,这证明指针已从映射中删除,因为delete()调用,因为(因为我们没有其他引用它)它有资格进行垃圾收集。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在Go中,删除指针映射的条目会导致内存泄漏吗? 的相关文章

  • 如何在 Linux 中编写文本模式 GUI? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 当我编写脚本 程序时 我经常想弹出一个简单的文本 gui 来提示输入 我该怎么做 例如 来自 Shel
  • 不明白 Swift 中的闭包示例

    我正在尝试了解 swift 和闭包 我被这个例子困住了 numbers map number Int gt Int in let result 3 number return result 什么是 number Int gt Int 它是一
  • 使用带有终结器的 C++/CLI 定义类时 C# 中的内存泄漏

    当我在 C CLI DLL 中实现一个类时 public ref class DummyClass protected DummyClass some dummy code std cout lt lt hello lt lt std en
  • 指针和cstring长度

    我在这里设置指针 一个指向名称 另一个指向名称 但获取长度 怎么当我使用的时候cout lt lt strlen tail 它一直告诉我长度是3 即使我输入的是 12 include
  • 如何使信号量超时

    Go 中的信号量是通过通道来实现的 一个例子是这样的 https sites google com site gopatterns concurrency semaphores https sites google com site gop
  • 将 time.Time 转换为字符串

    我正在尝试将数据库中的一些值添加到 string在围棋中 其中一些是时间戳 我收到错误 无法在数组元素中使用 U Created date 类型 time Time 作为类型字符串 我可以转换吗time Time to string typ
  • Golang 正则表达式在字符串之间替换

    我有一些可能采用以下形式的字符串 MYSTRING MYSTRING n MYSTRING n MYSTRING randomstringwithvariablelength n 我希望能够将其正则表达式为MYSTRING foo 基本上替
  • 直接从一个通道发送到另一个通道

    当从一个通道直接发送到另一个通道时 我偶然发现了令人惊讶的行为 package main import fmt func main my chan make chan string chan of chans make chan chan
  • x86 上未对齐的指针

    有人可以提供一个示例 将指针从一种类型转换为另一种类型由于未对齐而失败吗 在评论中这个答案 https stackoverflow com questions 544928 reading integer size bytes from a
  • 将嵌套字典键值转换为 pyspark 数据帧

    我有一个 Pyspark 数据框 如下所示 我想提取 dic 列中的那些嵌套字典并将它们转换为 PySpark 数据帧 像这样 请让我知道如何实现这一目标 Thanks from pyspark sql import functions a
  • 多重映射的每个元素是否都包含键和值?

    我无法想象没有人问过这个问题 但我没有运气找到它 a 的每个元素是否multimap包含它的价值and它的钥匙 这就是a的内部结构multimap看起来更像这样 map
  • JNI 将 Char* 2D 数组传递给 JAVA 代码

    我想从 C 代码通过 JNI 层传递以下指针数组 char result MAXTEST MAXRESPONSE 12 12 8 3 29 70 5 2 42 42 在java代码中我写了以下声明 public static native
  • 为什么这个二维指针表示法有效,而另一个则无效[重复]

    这个问题在这里已经有答案了 这里我编写了一段代码来打印 3x3 矩阵的对角线值之和 这里我必须将矩阵传递给函数 矩阵被传递给指针数组 代码可以工作 但问题是我必须编写参数的方式如下 int mat 3 以下导致程序崩溃 int mat 3
  • 如何关闭 gorm 1.20.0 中的数据库实例

    由于我没有在 Close 函数中找到 gorm 实例 任何帮助将不胜感激 dbURI fmt Sprintf user s password s dbname s port s sslmode s TimeZone s username p
  • 如何在Android地图上更改位置时删除标记并重新绘制它

    编辑前 我正在使用下面的代码在android地图上重绘一个标记 实际上它重绘了一个标记 但它并没有删除旧的标记 我尝试过 mapView invlaidate 但它并没有删除旧的 这是 onLocationChanged 函数 Overri
  • 在 Visual Studio Code 中调试 Go 测试

    在我的 Windows 计算机上 我安装了 Visual Studio Code 要手动运行测试 我进入控制台到项目文件夹并输入 go test main test go 它工作完美 但我遇到一种情况 我需要调试我的测试以了解发生了什么 为
  • 将数据帧行转换为字典

    我有像下面的示例数据这样的数据帧 我正在尝试将数据帧中的一行转换为类似于下面所需输出的字典 但是当我使用 to dict 时 我得到了索引和列值 有谁知道如何将行转换为像所需输出那样的字典 任何提示都非常感激 Sample data pri
  • 更改 R 中 ggplot geom_polygon 的颜色方案

    我正在使用地图库和 ggplot 的 geom polygon 创建地图 我只是想将默认的蓝色 红色 紫色配色方案更改为其他颜色 我对 ggplot 非常陌生 所以如果我没有使用正确的数据类型 请原谅 我使用的数据如下所示 gt head
  • 检查字典键是否有空值

    我有以下字典 dict1 city name yass region zipcode phone address tehsil planet mars 我正在尝试创建一个基于 dict1 的新字典 但是 它不会包含带有空字符串的键 它不会包
  • strcmp 给出分段错误[重复]

    这个问题在这里已经有答案了 这是我的代码给出分段错误 include

随机推荐

  • 使用泛型方法时如何正确约束相关类类型?

    我有两个基类BaseObject and BaseObjectSettings 第一个定义对象行为 第二个定义类的状态 对于序列化有用 如果我想创建具有特定设置的派生 BaseObject 类 那么我可以使用具有泛型类型约束的方法 publ
  • Payu付款错误“发生一些错误,请重试!”

    我已经通过官方文档将 payu 集成到我的 Android 应用程序中https www payumoney com dev guide mobilecheckout android html prereq 我面临的问题是我的代码与测试凭据
  • 检测 FFT 图中的峰值

    I was wondering how is it possible to detect new peaks within an FFT plot in Python let s say i have this simple Plot An
  • Android:如何阻止 Android 1.6+ 缩放图像

    我更新了我的构建以针对 Android 1 6 构建 现在我的位图在高密度屏幕上按比例缩小 我不想要这种行为 我试了一下 http blog tomgibara com post 190539066 android unscaled bit
  • 如何返回 tkinter 中作为命令给出的函数的值

    我用 python 写了一个非常简单的代码tkinter 它包含一个输入框 我想将用户插入的值保留给我自己 以备以后需要使用它 这是代码 import tkinter as tk root tk Tk root geometry 600x4
  • 将表从 Amazon RDS 导出到 CSV 文件

    我有一个 MySQL 数据库正在运行亚马逊RDS 我想知道如何将整个表导出为 CSV 格式 我目前在 Windows 上使用 MySQL 服务器来查询 Amazon 数据库 但是当我尝试运行导出时出现错误 可能是因为没有适用于 amazon
  • MvcTextTemplateHost 是什么以及在哪里可以找到

    我想知道这是什么MvcTextTemplateHost 我的 create tt 中有这个 但我无法在 bin 文件夹中找到它 使用对象查看器搜索 我读了一下 发现它在我的 VisualStudio Extensions web dll 但
  • R 行乘法 - 重新设计? [复制]

    这个问题在这里已经有答案了 比如说 如果我有一个 lots x 5 矩阵和一个 1 x 5 矩阵 是否有比这更好的方法将它们逐行相乘 gt q 1 2 3 4 5 1 1 2 3 4 5 gt z 1 2 3 4 5 1 1 6 11 16
  • 如何给 iframe 100% 高度[重复]

    这个问题在这里已经有答案了 我想 但它仍然没有调整它的大小 当我尝试以像素为单位的高度时 它起作用了 编辑 100 似乎可以在 IE 上运行 但不能在 Firefox 上运行 你可以用 CSS 来做到这一点 请注意 默认情况下 这会将其放置
  • Android中如何知道定位模式是WIFI还是2G/3G基站?

    我们知道Android中有两种定位模式 GPS和网络 如果我们使用网络 那么Android可以使用WIFI或2G 3G基站进行定位 如果没有GPS 我们可以简单地使用LocationManager NETWORK PROVIDER来获取位置
  • 信号量和条件的区别(ReentrantLock)

    有谁知道这些方法之间的区别acquire and release java util concurrent Semaphore and await and signal new ReentrantLock newCondition 您能为每
  • Python 列表推导式 - 转置

    我刚刚开始通过阅读列表理解矩阵转置教程在这里 我理解这个例子 但我试图找出一种转置矩阵的方法 而不需要对范围进行硬编码 matrix 1 2 3 4 5 6 7 8 9 10 11 12 lcomp row i for row in mat
  • 通过导航 doPostBack 使用 R 抓取网站

    我想定期从下面的站点提取表格 单击构建块名称 BLOK 16 A BLOK 16 B BLOK 16 C 时 价目表会发生变化 URL不改变 页面通过触发改变 javascript doPostBack ctl00 ContentPlace
  • Spark SQL saveAsTable 返回空结果

    我使用以下代码在 Spark SQL 中创建 插入数据到 Hive 表中 val sc SparkSession builder appName App master local 2 config spark sql warehouse d
  • quote_ident() 不会向列名“first”添加引号

    我需要获得正确用双引号引起来的列名 quote ident 好像没有做到吧 select 1 first fails select quote ident first produces first not first 我可以使用什么命令来成
  • 按字符串的组成部分对字符串列表进行排序

    一个长列表包含一些要排序的元素 实际上每个元素有4个内容 名称 进 出 区域和日期 时间 以 连接 可以更改 我想将列表重新组织为排序顺序 a list Chris Check in Zoom A 11 13 2013 05 20 Chri
  • 禁用热链接或直接下载我的视频,并且仅在视频从我的网站页面显示时流式传输

    我想禁用盗链FLV and MP4托管在我的服务器上的视频 除非视频是从其 URL 所在的页面显示的以 开始 http www mywebsite com index php main page videos page 我必须添加到 hta
  • 强制洗牌 NSMutableArray

    我有一个名为 putNumberUsed 的 NSMutableArray 它包含以下对象 blah1 blah2 blah3 blah4 我想随机洗牌这些对象 例如 如果我选择 putNumberUsed objectAtIndex 0
  • 音频播放无法开始

    NSError err Initialize audio player audioPlayer AVAudioPlayer alloc initWithContentsOfURL url error err audioPlayer dele
  • 在Go中,删除指针映射的条目会导致内存泄漏吗?

    第一次来到这里 首先NOTE in 切片技巧表明在剪切或删除指针切片中的元素时存在潜在的内存泄漏问题 地图也是如此吗 例如 https play golang org p 67cN0JggWY 在从地图中删除之前我们应该清零该条目吗 就像这