On Wed, Jun 1, 2016 at 7:00 PM, Eric Fiselier <e...@efcs.ca> wrote: > No the leak was my fault. The sneaky line was "std::shared_ptr<T> s(ptr, > &nullDeleter);", which caused the allocation of a shared control block. >
But surely the control block is allocated and deallocated by libc++ behind the scenes, foolproofly? > Since the deleter is a NOP it gets leaked and ASAN reports it. > Surely the NOP deleter applies only to the controlled object *ptr, not to the control block? Is the supplied deleter actually used to allocate/deallocate the control block as well? The controlled object *ptr is explicitly delete'd at the end of the test case, which is why it seems safe to me. –Arthur On Jun 1, 2016 6:15 PM, "Eric Fiselier via cfe-commits" < cfe-commits@lists.llvm.org> wrote: > Author: ericwf >>> Date: Wed Jun 1 20:09:12 2016 >>> New Revision: 271459 >>> >>> URL: http://llvm.org/viewvc/llvm-project?rev=271459&view=rev >>> Log: >>> Remove enable_shared_from_this test since it leaks the control block and >>> fails with ASAN >>> >>> Modified: >>> >>> libcxx/trunk/test/std/utilities/memory/util.smartptr/util.smartptr.enab/enable_shared_from_this.pass.cpp >>> >>> Modified: >>> libcxx/trunk/test/std/utilities/memory/util.smartptr/util.smartptr.enab/enable_shared_from_this.pass.cpp >>> URL: >>> http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/utilities/memory/util.smartptr/util.smartptr.enab/enable_shared_from_this.pass.cpp?rev=271459&r1=271458&r2=271459&view=diff >>> >>> ============================================================================== >>> --- >>> libcxx/trunk/test/std/utilities/memory/util.smartptr/util.smartptr.enab/enable_shared_from_this.pass.cpp >>> (original) >>> +++ >>> libcxx/trunk/test/std/utilities/memory/util.smartptr/util.smartptr.enab/enable_shared_from_this.pass.cpp >>> Wed Jun 1 20:09:12 2016 >>> @@ -88,32 +88,6 @@ int main() >>> } >>> #endif >>> } >>> - // Test LWG issue 2529 again. This time check that an expired >>> pointer >>> - // is replaced. >>> - { >>> - T* ptr = new T; >>> - std::weak_ptr<T> weak; >>> - { >>> - std::shared_ptr<T> s(ptr, &nullDeleter); >>> - assert(ptr->shared_from_this() == s); >>> - weak = s; >>> - assert(!weak.expired()); >>> - } >>> - assert(weak.expired()); >>> - weak.reset(); >>> -#ifndef TEST_HAS_NO_EXCEPTIONS >>> - try { >>> - ptr->shared_from_this(); >>> - assert(false); >>> - } catch (std::bad_weak_ptr const&) { >>> - } catch (...) { assert(false); } >>> -#endif >>> - { >>> - std::shared_ptr<T> s2(ptr, &nullDeleter); >>> - assert(ptr->shared_from_this() == s2); >>> - } >>> - delete ptr; >>> - } >>> // Test weak_from_this_methods >>> #if TEST_STD_VER > 14 >>> { >>> >>> >>> _______________________________________________ >>> cfe-commits mailing list >>> cfe-commits@lists.llvm.org >>> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits >>> >> >
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits