Click here to Skip to main content
15,886,919 members
Home / Discussions / C / C++ / MFC
   

C / C++ / MFC

 
QuestionLoading a Resource Pin
Anonymous20-Sep-05 19:05
Anonymous20-Sep-05 19:05 
AnswerRe: Loading a Resource Pin
Johann Gerell20-Sep-05 19:33
Johann Gerell20-Sep-05 19:33 
Questionmewtocol format programming Pin
jyhhaur20-Sep-05 17:24
sussjyhhaur20-Sep-05 17:24 
QuestionPrivate memory usage Pin
jimmiejams20-Sep-05 15:27
jimmiejams20-Sep-05 15:27 
AnswerRe: Private memory usage Pin
Blake Miller20-Sep-05 16:00
Blake Miller20-Sep-05 16:00 
GeneralRe: Private memory usage Pin
jimmiejams20-Sep-05 16:20
jimmiejams20-Sep-05 16:20 
GeneralRe: Private memory usage Pin
ThatsAlok20-Sep-05 18:59
ThatsAlok20-Sep-05 18:59 
GeneralRe: Private memory usage Pin
Blake Miller21-Sep-05 4:07
Blake Miller21-Sep-05 4:07 
Create an instance of CMemChecker.
Call CMemChecker.ScanMemory();
Examine CMemChecker.m_BytesPrivate

It will be as close or more accurate than the other tool.

If you want how much is used by the DLL and other executable images, then look at
CMemChecker.m_BytesImage

If you want to know how much 'memory' is being used, then look at
CMemChecker.m_BytesCommit

If you want to know how much of your virtual address space has been consumed, then look at total of CMemChecker.m_BytesCommit + CMemChecker.m_BytesReserved



<br />
<br />
//- -----------------------------------------------------------------<br />
//- Class CMemChecker<br />
//- -----------------------------------------------------------------<br />
<br />
#pragma once<br />
<br />
class CMemChecker<br />
{<br />
public:<br />
<br />
	CMemChecker();<br />
	virtual ~CMemChecker();<br />
<br />
	// fill in member variables<br />
	BOOL	ScanMemory(void);<br />
<br />
	// reset member variables<br />
	virtual void	ResetData(void);<br />
<br />
	// -----------------------------------------<br />
	// State<br />
<br />
	DWORD	m_BytesCommit;<br />
	DWORD	m_RegionCountCommit;<br />
<br />
	DWORD	m_BytesFree;<br />
	DWORD	m_RegionCountFree;<br />
<br />
	DWORD	m_BytesReserved;<br />
	DWORD	m_RegionCountReserved;<br />
<br />
	// -----------------------------------------<br />
	// Type<br />
	<br />
	// EXE, DLL, etc - tpyically executable<br />
	DWORD	m_BytesImage;<br />
	DWORD	m_RegionCountImage;<br />
<br />
	// memory mapped files - 'shared' memory<br />
	DWORD	m_BytesMapped;<br />
	DWORD	m_RegionCountMapped;<br />
<br />
	// allocated memory<br />
	DWORD	m_BytesPrivate;<br />
	DWORD	m_RegionCountPrivate;<br />
<br />
	// -----------------------------------------<br />
	// Miscellaneous<br />
<br />
	DWORD	m_BytesOrphaned;<br />
	DWORD	m_RegionCountOrphaned;<br />
<br />
	DWORD	m_BytesAvailable;<br />
	DWORD	m_RegionCountAvailable;<br />
<br />
	DWORD	m_RegionCountTotal;<br />
<br />
	DWORD	m_MaxFreeBlock;<br />
	DWORD	m_MinFreeBlock;<br />
<br />
protected:<br />
<br />
	// GetSystemInfo<br />
	SYSTEM_INFO	m_SystemInfo;<br />
<br />
	virtual void AccumulateData  (PMEMORY_BASIC_INFORMATION lpMemInfo);<br />
	virtual bool IsRegionOrphaned(PMEMORY_BASIC_INFORMATION lpMemInfo) const;<br />
<br />
};<br />
<br />
//- -----------------------------------------------------------------<br />
//- <br />
//- -----------------------------------------------------------------<br />
<br />
<br />
//- -----------------------------------------------------------------<br />
//- <br />
//- -----------------------------------------------------------------<br />
<br />
#include "stdafx.h"<br />
#include "limits.h"<br />
#include "CMemChecker.h"<br />
<br />
CMemChecker::CMemChecker()<br />
{<br />
	ResetData();<br />
}<br />
<br />
// virtual<br />
CMemChecker::~CMemChecker()<br />
{<br />
}<br />
<br />
//- -----------------------------------------------------------------<br />
<br />
// virtual <br />
void CMemChecker::ResetData(void)<br />
{<br />
	::GetSystemInfo(&m_SystemInfo);<br />
<br />
	// how many different regions were encountered <br />
	// while iterating the virtual memory<br />
	m_RegionCountTotal		= 0;<br />
<br />
	m_BytesCommit			= 0;<br />
	m_RegionCountCommit		= 0;<br />
<br />
	m_BytesFree				= 0;<br />
	m_RegionCountFree		= 0;<br />
<br />
	m_BytesReserved			= 0;<br />
	m_RegionCountReserved	= 0;<br />
<br />
	m_BytesImage			= 0;<br />
	// how many different regions contained images<br />
	m_RegionCountImage		= 0;<br />
<br />
	m_BytesMapped			= 0;<br />
	// how many different regions contained maps<br />
	m_RegionCountMapped		= 0;<br />
<br />
	m_BytesPrivate			= 0;<br />
	// how many different regions contained private bytes<br />
	m_RegionCountPrivate	= 0;<br />
<br />
	// bytes 'free' that can never be allocated<br />
	// because the free block is not on a 64K boundary<br />
	m_BytesOrphaned			= 0;<br />
	m_RegionCountOrphaned	= 0;<br />
<br />
	m_BytesAvailable		= 0;<br />
	m_RegionCountAvailable	= 0;<br />
<br />
	// maximum size of free block<br />
	m_MaxFreeBlock			= 0;<br />
	// minimum size of free block<br />
	m_MinFreeBlock			= ULONG_MAX;<br />
}<br />
<br />
//- -----------------------------------------------------------------<br />
//- start at minimum application address and scan memory <br />
//- until maximum application address.<br />
<br />
BOOL CMemChecker::ScanMemory(void)<br />
{<br />
	BOOL	bSuccess = TRUE;<br />
	SIZE_T  BytesRead;<br />
<br />
	MEMORY_BASIC_INFORMATION TheBuffer;<br />
<br />
	ResetData();<br />
<br />
	LPVOID	lpAddress = (LPVOID)m_SystemInfo.lpMinimumApplicationAddress;<br />
<br />
	while( lpAddress < m_SystemInfo.lpMaximumApplicationAddress ){<br />
<br />
		BytesRead = ::VirtualQuery(lpAddress, &TheBuffer, sizeof(TheBuffer));<br />
<br />
		if( BytesRead < sizeof(TheBuffer) ){<br />
			break;<br />
		} else {<br />
			AccumulateData(&TheBuffer);<br />
			// calculate new start address<br />
			lpAddress = (LPVOID)((DWORD)TheBuffer.BaseAddress + (DWORD)TheBuffer.RegionSize);<br />
		}<br />
	}<br />
<br />
	return bSuccess;<br />
}<br />
<br />
//- -----------------------------------------------------------------<br />
<br />
// virtual<br />
void CMemChecker::AccumulateData(<br />
	PMEMORY_BASIC_INFORMATION lpMemInfo<br />
){<br />
	m_RegionCountTotal++;<br />
	<br />
	// decode memory region state<br />
	switch( lpMemInfo->State ){<br />
<br />
	case MEM_COMMIT:<br />
		m_BytesCommit += lpMemInfo->RegionSize;<br />
		m_RegionCountCommit++;<br />
		break;<br />
<br />
	case MEM_FREE:<br />
		m_BytesFree += lpMemInfo->RegionSize;<br />
		m_RegionCountFree++;<br />
<br />
		// track largest free block available<br />
		if( m_MaxFreeBlock < lpMemInfo->RegionSize ){<br />
			m_MaxFreeBlock = lpMemInfo->RegionSize;<br />
		}<br />
<br />
		// track smallest free block available<br />
		if( m_MinFreeBlock > lpMemInfo->RegionSize ){<br />
			m_MinFreeBlock = lpMemInfo->RegionSize;<br />
		}<br />
<br />
		if( IsRegionOrphaned(lpMemInfo) ){<br />
<br />
			m_BytesOrphaned += lpMemInfo->RegionSize;<br />
			m_RegionCountOrphaned++;<br />
<br />
		} else {<br />
<br />
			m_BytesAvailable += lpMemInfo->RegionSize;<br />
			m_RegionCountAvailable++;<br />
		}<br />
<br />
		break;<br />
<br />
	case MEM_RESERVE:<br />
		m_BytesReserved += lpMemInfo->RegionSize;<br />
		m_RegionCountReserved++;<br />
		break;<br />
<br />
	}<br />
<br />
	// decode memory region type<br />
	switch( lpMemInfo->Type ){<br />
<br />
	case MEM_IMAGE:<br />
		m_BytesImage += lpMemInfo->RegionSize;<br />
		m_RegionCountImage++;<br />
		break;<br />
<br />
	case MEM_MAPPED:<br />
		m_BytesMapped += lpMemInfo->RegionSize;<br />
		m_RegionCountMapped++;<br />
		break;<br />
<br />
	case MEM_PRIVATE:<br />
		m_BytesPrivate += lpMemInfo->RegionSize;<br />
		m_RegionCountPrivate++;<br />
		break;<br />
<br />
	}<br />
}<br />
<br />
// virtual <br />
bool CMemChecker::IsRegionOrphaned(<br />
	PMEMORY_BASIC_INFORMATION lpMemInfo<br />
) const {<br />
    // not yet implemented<br />
	return false;<br />
}<br />
<br />
<br />
//- -----------------------------------------------------------------<br />
//- <br />
//- -----------------------------------------------------------------<br />
<br />

Questioncommand message Pin
Member 216100420-Sep-05 15:04
Member 216100420-Sep-05 15:04 
AnswerRe: command message Pin
John R. Shaw20-Sep-05 23:49
John R. Shaw20-Sep-05 23:49 
QuestionModeless Dialog Box Pin
suzie10020-Sep-05 14:19
suzie10020-Sep-05 14:19 
AnswerRe: Modeless Dialog Box Pin
Christian Graus20-Sep-05 14:23
protectorChristian Graus20-Sep-05 14:23 
AnswerRe: Modeless Dialog Box Pin
Shog920-Sep-05 18:14
sitebuilderShog920-Sep-05 18:14 
QuestionWriting/Reading Large files Pin
Jenleonard20-Sep-05 13:56
Jenleonard20-Sep-05 13:56 
AnswerRe: Writing/Reading Large files Pin
Christian Graus20-Sep-05 14:26
protectorChristian Graus20-Sep-05 14:26 
GeneralRe: Writing/Reading Large files Pin
Anonymous20-Sep-05 14:32
Anonymous20-Sep-05 14:32 
GeneralRe: Writing/Reading Large files Pin
Christian Graus20-Sep-05 14:38
protectorChristian Graus20-Sep-05 14:38 
AnswerRe: Writing/Reading Large files Pin
Axter20-Sep-05 19:06
professionalAxter20-Sep-05 19:06 
AnswerRe: Writing/Reading Large files Pin
kakan20-Sep-05 19:16
professionalkakan20-Sep-05 19:16 
GeneralRe: Writing/Reading Large files Pin
John R. Shaw21-Sep-05 0:31
John R. Shaw21-Sep-05 0:31 
GeneralRe: Writing/Reading Large files Pin
Jenleonard24-Sep-05 12:58
Jenleonard24-Sep-05 12:58 
GeneralRe: Writing/Reading Large files Pin
John R. Shaw25-Sep-05 20:10
John R. Shaw25-Sep-05 20:10 
QuestionDual Monitors - 1 needs to sleep Pin
gravits20-Sep-05 10:58
gravits20-Sep-05 10:58 
AnswerRe: Dual Monitors - 1 needs to sleep Pin
Neagoe Gabriel20-Sep-05 21:29
Neagoe Gabriel20-Sep-05 21:29 
QuestionHow to access environment variables? Pin
Member 227578520-Sep-05 10:24
Member 227578520-Sep-05 10:24 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.