managed_shared_memory memory leak(?)
Hello everyone,
the following trivial example highlights a memory leak according to MSVC
2010. Does anybody know why this is and how it can be avoided?
// The following three directives are required for MSVC's automatic
memory
// leak detection.
#define _CRTDBG_MAP_ALLOC
#include
El 25/04/2012 12:35, Michael Herrmann escribió:
Hello everyone,
the following trivial example highlights a memory leak according to MSVC 2010. Does anybody know why this is and how it can be avoided?
Interprocess creates some singletons for expensive operations and you
are testing for leaks before those singletons are destroyed. The
following test, in visual 10:
#define _CRTDBG_MAP_ALLOC
#include
Dear Ion,
thank you for your reply. I should have said, sorry, that I am using
Boost 1.49.0. I can see that such singletons would show up as memory
leaks. In your example, already including
boost/interprocess/managed_shared_memory.hpp seems to lead to the
creation of some singletons that are falsely reported as memory leaks.
However, there seems to be more than just these singletons, that is
additionally created when managed_shared_memory::construct is actually
used. Please consider the following example:
// The following three directives are required for MSVC's automatic
memory
// leak detection.
#define _CRTDBG_MAP_ALLOC
#include
El 25/04/2012 12:35, Michael Herrmann escribió:
Hello everyone,
the following trivial example highlights a memory leak according to MSVC 2010. Does anybody know why this is and how it can be avoided?
Interprocess creates some singletons for expensive operations and you are testing for leaks before those singletons are destroyed. The following test, in visual 10:
#define _CRTDBG_MAP_ALLOC #include
#include #include
static struct leak_detector { ~leak_detector() { _CrtDumpMemoryLeaks(); } } leak_detector_object;
int main(int argc, char *argv[]) { _CrtDumpMemoryLeaks(); return 0; }
The CrtDumpMemoryLeaks() call in main will be executed first and will report leaks (singletons are not still destroyed). The second _CrtDumpMemoryLeaks() called from the static variable will be called after interprocess singletons are destroyed (it's compiler dependent, but in my configuration the static variable is destroyed after interprocess singletons are destroyed) and reports no leaks.
Ion _______________________________________________ Boost-users mailing list Boost-users@lists.boost.org http://lists.boost.org/mailman/listinfo.cgi/boost-users
El 28/04/2012 14:16, Michael Herrmann escribió:
Dear Ion,
thank you for your reply. I should have said, sorry, that I am using Boost 1.49.0. I can see that such singletons would show up as memory leaks. In your example, already including boost/interprocess/managed_shared_memory.hpp seems to lead to the creation of some singletons that are falsely reported as memory leaks. However, there seems to be more than just these singletons, that is additionally created when managed_shared_memory::construct is actually used. Please consider the following example:
In trunk code singletons are created lazily (after main is entered) in some platforms. In Boost 1.49 (at least in Visual 7.1) your example does not detect any leak (_CrtMemDifference returns false). For singletons created on demand (trunk code), you can change the LazyInit template parameter to "false" in Interprocess code when intermodule_singleton, windows_intermodule_singleton, portable_intermodule_singleton classes are used (e.g. "get_bootstamp" in tmp_dir_helpers.hpp). This will force singleton creation before main starts. Best, Ion PD: FIIW, as singletons have many problems regarding destruction order, I'm experimenting with the "Phoenix Singleton" approach these days, using std::atexit to register singleton destruction. If this works, I think Lazily created phoenix-singletons will be the default in Interprocess.
participants (2)
-
Ion Gaztañaga
-
Michael Herrmann