2025年ifstream读取文件遇到空格被截断(ifstream获取文件长度)

ifstream读取文件遇到空格被截断(ifstream获取文件长度)多个协程由于竞争资源或者彼此通信而造成阻塞 不能退出 申请过多的 goroutine 来不及释放 三 内存泄漏的分类 在 Go 中内存泄漏分为暂时性内存泄漏和永久性内存泄漏 1 暂时性内存泄漏 暂时性泄漏 指的是该释放的内存资源没有及时释放 对应的内存资源仍然有机会在更晚些时候被释放 即便如此在内存资源紧张情况下 也会是个问题 这类主要是 string slice 底层 buffer 的错误共享

大家好,我是讯享网,很高兴认识大家。



多个协程由于竞争资源或者彼此通信而造成阻塞,不能退出。

  • 申请过多的goroutine来不及释放

三、内存泄漏的分类

在Go中内存泄漏分为暂时性内存泄漏和永久性内存泄漏。

1、暂时性内存泄漏

暂时性泄漏,指的是该释放的内存资源没有及时释放,对应的内存资源仍然有机会在更晚些时候被释放,即便如此在内存资源紧张情况下,也会是个问题。这类主要是 string、slice 底层 buffer 的错误共享,导致无用数据对象无法及时释放,或者 defer 函数导致的资源没有及时释放。


讯享网

  • 获取长字符串中的一段导致长字符串未释放
  • 获取长slice中的一段导致长slice未释放

s0 = s1[:50],
s0 = s1[len(s1)-30:]
获取长string或者切片中的一段内容,由于新生成的对象和老的string或者切片共用一个内存空间,会导致老的string和切片资源暂时得不到释放,造成短暂的内存泄漏。
字符串——两次拷贝,s0 = string([]byte(s1[:50])),s0 := (” “ + s1[:50])[1:]
切片——使用copy函数,copy(s0, s1[len(s1)-30:])

  • 获取指针切片slice中的一段

s := []*int{new(int), new(int), new(int), new(int)}
return s[1:3:3]
这种情况下:当函数返回后,只要s还存活,s中的所有元素都不能被释放,即使s中的第一个元素和最后一个元素没有被使用了,也不能被释放。我们可以将不要的元素置为nil就能解决这个问题。
s := []*int{new(int), new(int), new(int), new(int)}
s[0], s[len(s)-1] = nil, nil
return s[1:3:3]

  • defer 导致的内存泄漏
2、永久性内存泄漏

永久性泄漏,指的是在进程后续生命周期内,泄漏的内存都没有机会回收,如 goroutine 内部预期之外的for-loop或者chan select-case导致的无法退出的情况,导致协程栈及引用内存永久泄漏问题。

  • goroutine 泄漏导致内存泄漏;

channel 阻塞导致 goroutine 阻塞
select 操作导致 goroutine 阻塞
互斥锁没有释放,互斥锁死锁
申请过多的goroutine来不及释放

  • 定时器使用不当,time.Ticker未关闭导致内存泄漏;

time.After在定时器到达时,会自动内回收。time.Ticker 钟摆不使用时,一定要Stop,不然会造成内存泄漏。

  • 不正确地使用终结器(Finalizers)导致内存泄漏

三、其他不正当使用内存场景

1、大数组作为参数导致短期内内存激增

由于数组是Golang的基本数据类型,每个数组占用不同的内存空间,生命周期互不干扰,很难出现内存泄漏的情况。但是数组作为形参传输时,遵循的是值拷贝,如果函数被多次调用且数组过大时,则会导致内存使用激增。

小讯
上一篇 2025-05-22 15:24
下一篇 2025-05-28 07:03

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/171685.html