------- Comment #10 from tjgolubi at netins dot net  2010-03-01 22:22 -------
Subject: Re:  std::unique_ptr::reset() does not conform to N3035.

I see your point.
I think it should still check for resetting to the same value to avoid 
duplicate deletes later.

terry

      void
      reset(pointer __p = pointer())
      {
        pointer old_p = get();
        if (__p != old_p)
          {
            std::get<0>(_M_t) = __p;
            if (old_p != pointer()) // <-------- added this line
               get_deleter()(old_p);
          }
      }

----- Original Message ----- 
From: "jwakely dot gcc at gmail dot com" <gcc-bugzi...@gcc.gnu.org>
To: <tjgol...@netins.net>
Sent: Monday, March 01, 2010 9:05 AM
Subject: [Bug libstdc++/43183] std::unique_ptr::reset() does not conform to 
N3035.


>
>
> ------- Comment #5 from jwakely dot gcc at gmail dot com  2010-03-01 
> 15:05 -------
> OK, I'm back and have had time to look at this.  I vaguely remember 
> noticing
> that the assignment and the deleter invocation happened in the wrong order 
> in
> our implementation, but I must have forgotten about it as I don't have any
> uncommitted change (or even a comment) in my working copy.
>
> The suggested change is still incorrect: the wrong condition is checked. 
> The
> deleter must be invoked when old_p != NULL, rather than when old_p != p.
> Consider:
>
> unique_ptr<int> p1;
> p1.reset(new int);
>
> The deleter should not be invoked by the call to reset, because old_p ==
> nullptr.
>
> Another case:
>
>  unique_ptr<int> p(new int);
>  p.reset(p.get());
>  p.release();
>
> This should not leak, but with the suggested change it will, because the
> deleter will not get invoked.
>
> A better implementation would be (untested):
>
>      void
>      reset(pointer __p = pointer())
>      {
>        pointer __old = get();
>        std::get<0>(_M_t) = __p;
>        if (__old != 0)
>          std::get<1>(_M_t)(__old);
>      }
>
>
> -- 
>
>
> http://gcc.gnu.org/bugzilla/show_bug.cgi?id=43183
>
> ------- You are receiving this mail because: -------
> You reported the bug, or are watching the reporter. 


-- 


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=43183

Reply via email to