Re: shared_ptr with no-op deleter
On 2015-01-28 14:19, filip.konvicka@googlemail.com wrote:
I stumbled upon a problem that I first thought could be a compiler
problem, but since this seems to be happening in both MSVC 2013 and
g++ 4.9.2 I think that maybe my understanding of the standard is not
correct.
Is code below legal?
Ignoring the missing inclusion of header <thread> it looks fine to me.
(For unforgivable reasons, but...) I am creating shared pointers to
a statically-allocated object with a no-op custom deleter.
This should just work.
While this
used to work with boost::shared_ptr without a problem, it seems to crash
with std::shared_ptr in the scenario when multiple threads are creating
the shared pointers concurrently.
I think I've heard that there is
a subtle difference between std::shared_ptr and boost::shared_ptr
implementation related to the counters allocation, and the crashes I'm
experiencing do seem to appear when a shared pointer gets destroyed (and
the counter reaches zero and - I assume - tries to destroy the counter,
but it looks as if the memory has already been free'd - at least this is
what Valgrind is telling me).
Implementation differences shouldn't be considered here: Any differences
of the specification in this context would be relevant (assuming the
implementations are conforming), but I fail to see one that would affect
your example.
I was unable to create a small repro though; the code below does seem to
work. In my real scenario, the 'getpint' function resides in
a dynamically linked library (but I don't know whether that could be
a contributing factor).
My guess is that your real-world program involving a dynamically linked
library is the actual root of the problem. When you talk about such
beasts, are you referring to loading and unloading the library
explicitly by a pair of LoadLibray/FreeLibrary, or dlopen/dlclose calls?
HTH & Greetings from Bremen,
Daniel Kr?gler
--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]