There's a finalizer being set on `*gmp.Int` when `SetString()` is called. Since `newnum` is a `gmp.Int` and not a `*gmp.Int` and `newnum` is copied into `output_array`, the pointer with the finalizer set on it is no longer referenced and the finalizer is eligible to be run when the next GC occurs.
If you put a manual call to `runtime.GC()` in the loop the issue presents itself much more quickly. The issue does not occur if you avoid copying `newnum` by storing pointers in the slice. https://play.golang.org/p/l7kXpxArc1 On Sun, May 14, 2017 at 12:20 PM, <[email protected]> wrote: > Here is a test case below. > > In short, it's appending the same number to an array, but after 2500 loops > or so the value changes. > > package main > import ( > "fmt" > "github.com/ncw/gmp" > // "math/big" > ) > func test_gmp_array() { > index := 0 > output_array := []gmp.Int{} > for index < 5000 { > var newnum gmp.Int > > newnum.SetString("27928410756179523138881080989986005991789933932188228018115755918494634799929873910027825747854697455979387110847058629350347288500624884424807086906801594642406392448568530327829083514883524712985492538589993807582131300292739787897589360129490451849769622648595726892334513355855504557741514903175075958458960111055024641406976670602678887952234068019841236549447926340755063903373950684252611325596552928912480285833159841819645546289989159869982214159616531691638376958340264087137749469269647555189450117026947774590910035240238694361652478067361121651905941283054193444516391789652433009672685099320489013369511", > 10) > output_array = append(output_array, newnum) > fmt.Println("array_size: ", len(output_array)) > fmt.Println(&output_array[0]) > index += 1 > } > } > > func main() { > test_gmp_array(); > } > > > On Sunday, May 14, 2017 at 7:53:51 AM UTC-4, Damian Gryski wrote: >> >> >> >> On Sunday, May 14, 2017 at 4:01:26 AM UTC+2, Elise Xue wrote: >>> >>> We're using gmp (library found at https://github.com/ncw/gmp) to run on >>> large inputs, and we have arrays with thousands of elements at a time in >>> our code. When we write these arrays to files, we find that the values of >>> some of the elements have changed. >>> >>> >>> We tested our by code by reading in an input file of large numbers, >>> casting them to gmp.Int, storing them in an array, and writing them to an >>> output file. This works for an array of ~1400 numbers, but if the array >>> gets any larger than that the values in the array change. >>> >>> Below we print the first element of our array each time a new element >>> gets appended. As the size goes past 1435, the value of the first value >>> changes, and it changes again when the size goes past 1437: >>> >>> >>> >> Can you provide example code that demonstrates the issue? >> >> Damian >> > -- > You received this message because you are subscribed to the Google Groups > "golang-nuts" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to [email protected]. > For more options, visit https://groups.google.com/d/optout. > -- You received this message because you are subscribed to the Google Groups "golang-nuts" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. For more options, visit https://groups.google.com/d/optout.
