реализации - Delete / Cut:
NOTE If the type of the element is a pointer or a struct with pointer fields, which need to be garbage collected, the above implementations of Cut and Delete have a potential memory leak problem: some elements with values are still referenced by slice a and thus can not be collected. The following code can fix this problem:
https://go.dev/play/p/T6gTsPIhFuY
Пытаюсь разобраться откуда там берется формулировка potential. В моем примере _leak_ есть, т.к. есть копия на оригинальный слайс и остается указатель на _удаленный_ элемент. Но если бы не было бы этой строчки: b := a[:] - был бы какой-то leak? Если да, то почему?
b это копия слайса a, не данных слайса. Утечка в другом, в ссылках хранящихся в ячейчах. Если обрезаете слайс, то хвостики так же будут сслыться на данные, хоть они и находятся за границами используемого слайса.
Вот здесь про это тоже написано: https://go.dev/blog/slices-intro As mentioned earlier, re-slicing a slice doesn’t make a copy of the underlying array. The full array will be kept in memory until it is no longer referenced. Occasionally this can cause the program to hold all the data in memory when only a small piece of it is needed. ... Since the slice references the original array, as long as the slice is kept around the garbage collector can’t release the array; the few useful bytes of the file keep the entire contents in memory.
стало понятно, спасибо
Обсуждают сегодня