Overloaded assignment operators can leak memory #2581

Closed
eholk opened this Issue Jun 13, 2012 · 1 comment

Projects

None yet

1 participant

@eholk

It seems to involve pointers... Here's a test case with several examples and non-examples.

impl methods<T: copy> for [T] {
    fn -(x: [T]/&) -> [T] {
        [x[0], x[0], x[0]]
    }

    fn foo(x: [T]/&) -> [T] {
        [x[0], x[0], x[0]]
    }
}

impl methods<T: copy> for ~T {
    fn +(rhs: ~T) -> ~T {
        rhs
    }
}

impl methods for ~int {
    fn -(rhs: ~int) -> ~int {
        ~(*self - *rhs)
    }
}

fn main() {
    // leaks
    let mut bar = [1, 2, 3];
    bar -= [3, 2, 1];
    bar -= [4, 5, 6];

    io::println(#fmt("%?", bar));

    // okay
    let mut bar = [1, 2, 3];
    bar = bar.foo([3, 2, 1]);
    bar = bar.foo([4, 5, 6]);

    io::println(#fmt("%?", bar));

    // okay
    let mut bar = [1, 2, 3];
    bar = bar - [3, 2, 1];
    bar = bar - [4, 5, 6];

    io::println(#fmt("%?", bar));

    // Leaks
    let mut bar = ~1;
    bar += ~2;
    bar += ~3;

    io:: println(#fmt("%?", bar));

    // Leaks
    let mut bar = ~1;
    bar -= ~2;
    bar -= ~3;

    io:: println(#fmt("%?", bar));
}
@eholk

This problem is also present with @int, but they show up as an unreclaimed object in the cycle collector.

@eholk eholk was assigned Jun 13, 2012
@eholk eholk added a commit to eholk/rust that referenced this issue Jun 13, 2012
@eholk eholk Generate a temporary for assign_ops. Issue #2581 fa7db7b
@eholk eholk added a commit to eholk/rust that referenced this issue Jun 14, 2012
@eholk eholk Generate a temporary for assign_ops. Issue #2581 3391b31
@eholk eholk closed this Jun 21, 2012
@eholk eholk removed their assignment Jun 16, 2014
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment