golang 下的内存泄漏等问题汇总

Memory Leaking Scenarios -Go 101

文中提到的substring和string公用底层的结构。但是如果我们之间打印substring和string的指针地址,会发现其实两者并不一样。

其实原因是string在golang的实际实现是reflect.StringHeader。同理slice的实际实现是*reflect.SliceHeader。因此比较两个string的地址应该用如下方式:

	x := "x"
	y1 := x[0:1]
	sh := (*reflect.StringHeader)(unsafe.Pointer(&x))
	ch := (*reflect.StringHeader)(unsafe.Pointer(&y1))
	fmt.Println(sh.Data, ch.Data)
	x1 := []int{12}
	y2 := x1[0:1]

	xr := (*reflect.SliceHeader)(unsafe.Pointer(&x1))
	yr := (*reflect.SliceHeader)(unsafe.Pointer(&y2))
	fmt.Printf("%v,%v,%v\n", xr.Data, yr.Data, len(x1))

这样可以看到打印出来的结果是相同的。

Go unsafe.Pointer uintptr原理和玩法

runtime.SetFinalizer使用学习

详解Go语言中的内存对齐_Golang_脚本之家

More about Deferred Function Calls

Go程序内存泄露问题快速定位

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值