Hello everyone,
I am experiencing a memory leak while using pool_allocator with
std::vector. I am detecting this with _CrtDumpMemoryLeaks() on MSVC8.
The full program listing is at the end of the program.
The leaks reported are:
Detected memory leaks!
Dumping objects ->
{122} normal block at 0x00356518, 520 bytes long.
Data: < e5 e5 $e5 (e5 > 1C 65 35 00 20 65 35 00 24 65 35 00 28 65 35 00
{121} normal block at 0x003563D0, 264 bytes long.
Data: < c5 c5 c5 c5 > D4 63 35 00 D8 63 35 00 DC 63 35 00 E0 63 35 00
{120} normal block at 0x00356308, 136 bytes long.
Data: < c5 c5 c5 c5 > 0C 63 35 00 10 63 35 00 14 63 35 00 18 63 35 00
Object dump complete.
This could be due to a static object being destroyed after main()
returns but I couldn't know that without knowing the implementation of
pool_allocator. I have tried getting mem checkpoints at the beginning
and end of main and detecting the leaks that way which I *think* would
get around static objects but without any difference.
Thanks,
Georgios
#define CRTDBG_MAP_ALLOC
#include <cstdlib>
#include
#include <stdexcept>
#if defined(_DEBUG)
inline void* __cdecl operator new(size_t nSize)
{
void* pResult = _malloc_dbg(nSize, _NORMAL_BLOCK, NULL, 0);
if (pResult != NULL)
return pResult;
else
throw std::bad_alloc();
return pResult;
}
inline void __cdecl operator delete(void* p)
{
_free_dbg(p, _NORMAL_BLOCK);
}
inline void* __cdecl operator new[](size_t nSize)
{
return ::operator new(nSize);
}
inline void __cdecl operator delete[](void* p)
{
::operator delete(p);
}
inline void* __cdecl operator new(size_t nSize, int nType, const char *
lpszFileName, int nLine)
{
void* pResult = _malloc_dbg(nSize, nType, lpszFileName, nLine);
if (pResult != NULL)
return pResult;
else
throw std::bad_alloc();
return pResult;
}
inline void* __cdecl operator new[](size_t nSize, int nType, const char
* lpszFileName, int nLine)
{
return ::operator new(nSize, nType, lpszFileName, nLine);
}
inline void* __cdecl operator new(size_t nSize, const char *
lpszFileName, int nLine)
{
return ::operator new(nSize, _NORMAL_BLOCK, lpszFileName, nLine);
}
inline void* __cdecl operator new[](size_t nSize, const char *
lpszFileName, int nLine)
{
return ::operator new[](nSize, _NORMAL_BLOCK, lpszFileName, nLine);
}
inline void __cdecl operator delete(void* pData, const char * /*
lpszFileName */, int /* nLine */)
{
::operator delete(pData);
}
inline void __cdecl operator delete[](void* pData, const char * /*
lpszFileName */, int /* nLine */)
{
::operator delete(pData);
}
#define DEBUG_NEW new(THIS_FILE, __LINE__)
#endif // _DEBUG
#include <vector>
#include
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
int main(void)
{
std::vector data_points;
for(int i = 0; i < 100; ++i) {
data_points.push_back(i);
}
data_points.~vector();
boost::singleton_pool::release_memory();
_CrtDumpMemoryLeaks();
return 0;
}