Posts tagged _msize

How to find the size of dynamically allocated array?

0


While passing dynamically allocated arrays to functions, we usually pass the pointer and size of array. Its because we cannot identify how many members are be present in the allocated array. It will be nice to find the size of array from the pointer itself so that we can eliminate that extra variable. But is it possible? Yes, you can find the size of array from pointer itself. But how?


You can use _msize(). If you give a pointer, it will return back the allocated size in bytes. See the sample code snippet below.

// Allocate some objects.
CRect* pRectArray = new CRect[50];
...
// Calculate the array size from pointer.
int ArraySize = _msize( pRectArray ) / sizeof( CRect );


Note that this is microsoft extension and is not the part of standard C++. Now throw away that extra size parameter from your functions. ;)


Targeted Audience – Intermediate.

How to find the source filename and line no. from memory pointer in debug version.

2


It will be nice, if its possible to find out the source filename and line number where the pointer is allocated by just using the memory pointer itself. Yes its possible! But only in debug version.


When you call new, the c runtime library allocates the memory and returns the pointer. But infront of the given pointer, one CRT MemoryBlock Header is secretly kept in debug version. see the declarations of Debug MemoryBlock header below.

typedef struct _CrtMemBlockHeader
{
struct _CrtMemBlockHeader * pBlockHeaderNext;
struct _CrtMemBlockHeader * pBlockHeaderPrev;
char *                      szFileName;
int                         nLine;
size_t                      nDataSize;
int                         nBlockUse;
long                        lRequest;
unsigned char               gap[nNoMansLandSize];
} _CrtMemBlockHeader;

In this header, several information about the allocated memory block is available – such as size of memory block, source filename and line no. where the memory is allocated, whether the memory block currently in use etc etc.


From the pointer, access the MemoryBlock header. Then all these informations will be available. See the code snippet below.

// decleration of MemoryBlock header from CRT Source.
#define nNoMansLandSize 4
typedef struct _CrtMemBlockHeader
{
struct _CrtMemBlockHeader * pBlockHeaderNext;
struct _CrtMemBlockHeader * pBlockHeaderPrev;
char *                      szFileName;
int                         nLine;
size_t                      nDataSize;
int                         nBlockUse;
long                        lRequest;
unsigned char               gap[nNoMansLandSize];
} _CrtMemBlockHeader;

...

// Allocate some memory.
float* pFloat = new float[100];

// Get the memory block header.
_CrtMemBlockHeader* pMemoryBlockHeader =
    reinterpret_cast<_CrtMemBlockHeader*>( pFloat );
--pMemoryBlockHeader;

// Source File and location where the memory is allocated.
CString csSourceFileName = pMemoryBlockHeader->szFileName;
DWORD dwLineNumber = pMemoryBlockHeader->nLine;


The memory allocation is different in debug and release. isn’t it? ;)


Targeted Audience – Advanced.

Go to Top