void reset(pointer _Ptr = pointer()) _NOEXCEPT
{ // establish new pointer
pointer _Old = get();
this->_Myptr() = _Ptr;
if (_Old != pointer())
{
this->get_deleter()(_Old);
}
}#include "stdafx.h"
#include <memory>
#include <thread>
#include <functional>
#include <mutex>
#include <atomic>
#include <iostream>
class A
{
public:
A()
{
m_stop = false;
m_thr = std::thread(&A::worker, this);
}
~A()
{
m_stop = true;
if (m_thr.joinable())
m_thr.join();
}
void set_f(std::function<void()> f)
{
std::lock_guard<std::recursive_mutex> lock(m_mtx);
m_f = std::move(f);
}
void print()
{
std::lock_guard<std::recursive_mutex> lock(m_mtx);
std::cout << "print\n";
}
private:
void worker()
{
while (!m_stop)
std::this_thread::sleep_for(std::chrono::milliseconds(100));
call_f();
}
void call_f()
{
std::lock_guard<std::recursive_mutex> lock(m_mtx);
if (m_f)
m_f();
}
private:
std::atomic_bool m_stop;
std::thread m_thr;
std::recursive_mutex m_mtx;
std::function<void()> m_f;
};
int main()
{
auto p = std::make_unique<A>();
p->set_f([&p]() { p->print(); });
p.reset();
return 0;
}
msvcp140d.dll!0f563c93() Unknown
[Frames below may be incorrect and/or missing, no symbols loaded for msvcp140d.dll]
msvcp140d.dll!0f56425e() Unknown
> crash_up.exe!std::_Mtx_lockX(_Mtx_internal_imp_t * _Mtx) Line 72 C++
crash_up.exe!std::_Mutex_base::lock() Line 49 C++
crash_up.exe!std::lock_guard<std::recursive_mutex>::lock_guard<std::recursive_mutex>(std::recursive_mutex & _Mtx) Line 514 C++
crash_up.exe!A::print() Line 33 C++
crash_up.exe!main::__l2::<lambda>() Line 62 C++
crash_up.exe!std::_Invoker_functor::_Call<void <lambda>(void) &>(main::__l2::void <lambda>(void) & _Obj) C++
crash_up.exe!std::invoke<void <lambda>(void) &>(main::__l2::void <lambda>(void) & _Obj) C++
crash_up.exe!std::_Invoker_ret<void,1>::_Call<void <lambda>(void) &>(main::__l2::void <lambda>(void) & <_Vals_0>) C++
crash_up.exe!std::_Func_impl_no_alloc<void <lambda>(void),void>::_Do_call() C++
crash_up.exe!std::_Func_class<void>::operator()() C++
crash_up.exe!A::call_f() Line 50 C++
crash_up.exe!A::worker() Line 43 C++
crash_up.exe!std::_Invoker_pmf_pointer::_Call<void (__thiscall A::*)(void),A *>(void(A::*)() _Pmf, A * && _Arg1) C++
crash_up.exe!std::invoke<void (__thiscall A::*)(void),A *>(void(A::*)() && _Obj, A * && <_Args_0>) C++
crash_up.exe!std::_LaunchPad<std::unique_ptr<std::tuple<void (__thiscall A::*)(void),A *>,std::default_delete<std::tuple<void (__thiscall A::*)(void),A *> > > >::_Execute<0,1>(std::tuple<void (__thiscall A::*)(void),A *> & _Tup, std::integer_sequence<unsigned int,0,1> __formal) Line 238 C++
crash_up.exe!std::_LaunchPad<std::unique_ptr<std::tuple<void (__thiscall A::*)(void),A *>,std::default_delete<std::tuple<void (__thiscall A::*)(void),A *> > > >::_Run(std::_LaunchPad<std::unique_ptr<std::tuple<void (__thiscall A::*)(void),A *>,std::default_delete<std::tuple<void (__thiscall A::*)(void),A *> > > > * _Ln) Line 245 C++
crash_up.exe!std::_LaunchPad<std::unique_ptr<std::tuple<void (__thiscall A::*)(void),A *>,std::default_delete<std::tuple<void (__thiscall A::*)(void),A *> > > >::_Go() Line 230 C++
crash_up.exe!std::_Pad::_Call_func(void * _Data) Line 208 C++
ucrtbased.dll!0f2f6a58() Unknown
ucrtbased.dll!0f2f6789() Unknown
kernel32.dll!773c7c04() Unknown
ntdll.dll!77c9ad2f() Unknown
ntdll.dll!77c9acfa() Unknown
int main()
{
auto p = new A;
p->set_f([&p]() { p->print(); });
delete p;
return 0;
}| From: 'gicutza' via ISO C++ Standard - Discussion Sent: Wednesday, May 16, 2018 3:37 PM To: ISO C++ Standard - Discussion Reply To: std-dis...@isocpp.org Subject: [std-discussion] Re: VC++ 2017 std::unique_ptr::reset implementation |
| Original Message | |
| From: danel_danel via ISO C++ Standard - Discussion Sent: Thursday, May 17, 2018 2:00 AM |
Subject: Re: [std-discussion] Re: VC++ 2017 std::unique_ptr::reset implementation |