Memory leak with dynamic array
bearophile
bearophileHUGS at lycos.com
Sat Apr 10 15:17:12 PDT 2010
This can help confuse your mind a bit:
import std.stdio: writeln;
void main() {
{
int[] arr = [0, 1, 2, 3, 4, 5, 6].dup;
int[] slice = arr[2 .. 4];
writeln("arr, slice: ", arr, " | ", slice); // arr, slice: 0 1 2 3 4 5 6 | 2 3
slice ~= 10; slice ~= 20;
writeln("arr.capacity, slice.capacity: ", arr.capacity, " ", slice.capacity); // arr.capacity, slice.capacity: 7 7
writeln("arr, slice: ", arr, " | ", slice); // arr, slice: 0 1 2 3 4 5 6 | 2 3 10 20
}
{
int[] arr = [0, 1, 2, 3, 4, 5, 6].dup;
int[] slice = arr[2 .. 4];
writeln("arr, slice: ", arr, " | ", slice); // arr, slice: 0 1 2 3 4 5 6 | 2 3
slice.assumeSafeAppend;
slice ~= 10; slice ~= 20; // causes stomping
writeln("arr.capacity, slice.capacity: ", arr.capacity, " ", slice.capacity); // arr.capacity, slice.capacity: 0 5
writeln("arr, slice: ", arr, " | ", slice); // arr, slice: 0 1 2 3 10 20 6 | 2 3 10 20
slice ~= 30; slice ~= 40;
writeln("arr.capacity, slice.capacity: ", arr.capacity, " ", slice.capacity); // arr.capacity, slice.capacity: 7 7
writeln("arr, slice: ", arr, " | ", slice); // arr, slice: 0 1 2 3 10 20 30 | 2 3 10 20 30 40
}
}
The slice.capacity = 7 in the first case is just a coincidence, it's the result of the overallocation.
But I don't know why arr.capacity is zero and then seven in the second and third case.
Bye,
bearophile
More information about the Digitalmars-d-learn
mailing list