• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 1014
  • Last Modified:

GlobalMemoryStatus question

Can I use GlobalMemoryStatus to find out how much memory my program is using.

For example
Launch My program
Available memory = GlobalMemoryStatus
Do something in my program
Available memory = GlobalMemoryStatus
Do something in my program
Available memory = GlobalMemoryStatus
etc....

I could then try and find any creeping memory leaks this way.

Is the above method a good way to do this?

0
Wanting2LearnMan
Asked:
Wanting2LearnMan
3 Solutions
 
ZoppoCommented:
Hi Wanting2LearnMan,

'GlobalMemoryStatus' can be used to gather information about system-wide memory information.

To find information about your program's memory usage you can use 'GetProcessMemoryInfo' from PSAPI, i.e.:

> #include <psapi.h>
> #pragma comment( lib, "psapi.lib" )
> ...
> HANDLE hProcess = GetCurrentProcess();
> PROCESS_MEMORY_COUNTERS info = { sizeof( info ) };
> GetProcessMemoryInfo( hProcess, &info, sizeof( info ) );

> int *x = new int [ 200000 ];
>
> GetProcessMemoryInfo( hProcess, &info, sizeof( info ) );
>
> delete [] x;
>
> GetProcessMemoryInfo( hProcess, &info, sizeof( info ) );

Hope that helps,

ZOPPO
0
 
jkrCommented:
>>I could then try and find any creeping memory leaks this way.

If your goal is to find memory leaks, that is a way, but there are better ones. E.g.

#ifdef _DEBUG
#ifndef _DBG_NEW

#include <crtdbg.h>

inline void* __operator_new(size_t __n) {
     return ::operator new(__n,_NORMAL_BLOCK,__FILE__,__LINE__);
}
inline void* _cdecl operator new(size_t __n,const char* __fname,int __line) {
     return ::operator new(__n,_NORMAL_BLOCK,__fname,__line);
}
inline void _cdecl operator delete(void* __p,const char*,int) {
     ::operator delete(__p);
}

#define _DBG_NEW new(__FILE__,__LINE__)
#define new _DBG_NEW


#endif // _DBG_NEW
#else

#define __operator_new(__n) operator new(__n)

#endif

Then, add

               int tmpFlag;

               // Get the current state of the flag
               // and store it in a temporary variable
               tmpFlag = _CrtSetDbgFlag( _CRTDBG_REPORT_FLAG );

               // Turn On (OR) - Keep freed memory blocks in the
               // heap's linked list and mark them as freed
               tmpFlag |= _CRTDBG_LEAK_CHECK_DF;

               // Set the new state for the flag
               _CrtSetDbgFlag( tmpFlag );


to your app's start code and call

               _CrtDumpMemoryLeaks ();


to before the program ends and you'll get the line number where the allocation occured.
0
 
Wanting2LearnManAuthor Commented:
WHen I do:

 #include <psapi.h>
 #pragma comment( lib, "psapi.lib" )

i get: fatal error LNK1104: cannot open file 'psapi.lib'

How do I solve this problem?  My IDE is eVC++4.0.

Thanks
0
 
pgnatyukCommented:
You can use the function you mentioned. For example:
inline void LogMemoryStatus()
{
      SYSTEMTIME stime = { 0 };
      ::GetSystemTime(&stime);
      Trace(TEXT("-----------------"));
      Trace(TEXT("Time: %02d %02d %02d %03d\n"), stime.wHour,
            stime.wMinute, stime.wSecond, stime.wMilliseconds);
      MEMORYSTATUS st = { sizeof(MEMORYSTATUS) };
      ::GlobalMemoryStatus(&st);
      Trace(TEXT("Total: Physical %d, Virtual %d.\n"),
            st.dwTotalPhys, st.dwTotalVirtual);
      Trace(TEXT("Load: %d, Free: Physical %d, Virtual %d\n"),
            st.dwMemoryLoad, st.dwAvailPhys, st.dwAvailVirtual);
      Trace(TEXT("================"));
}
You will have to implement your Trace function - an output to a file/com/whatever.
You can use the remote tools from the SDK installed on you computer together with eVC4 - remote HeapWalker and/or others.
0

Featured Post

Free Tool: ZipGrep

ZipGrep is a utility that can list and search zip (.war, .ear, .jar, etc) archives for text patterns, without the need to extract the archive's contents.

One of a set of tools we're offering as a way to say thank you for being a part of the community.

Tackle projects and never again get stuck behind a technical roadblock.
Join Now