【问题标题】:GlobalMemoryStatusEx() (Win32)GlobalMemoryStatusEx() (Win32)
【发布时间】:2011-10-11 16:12:29
【问题描述】:

MSDN 中 GlobalMemoryStatusEx() 的描述说:

GlobalMemoryStatusEx 函数返回的信息是不稳定的。无法保证对该函数的两次连续调用将返回相同的信息。

此函数返回的一条信息是“以字节为单位的总物理内存”。 (这与可用的 FREE 物理内存的数量不同,MEMORYSTATUSEX 结构中还有另一个成员。)

每次运行程序时,总物理内存如何变化?我将值输出到文本文件并得到以下结果:

55872198592
55837267904
8589934605
55835301824
55848146880
55849064384
55849129920
55836743616
8589934605
8589934605
8589934605
8589934605
55835105216

我有 4GB 的系统 RAM。如果我使用的是 64 位操作系统,是否需要调用另一个 API 函数?

代码如下:

#include <Windows.h>
#include <string>
#include <sstream>
#include "Game.h"
#include <fstream>

void Game::CheckMemory(DWORDLONG& a)
{
MEMORYSTATUSEX status;
GlobalMemoryStatusEx(&status);

a = status.ullTotalPhys;

std::stringstream ss;

ss << "Total Physical Memory: " << status.ullTotalPhys << "bytes." << std::endl;

MessageBoxA(NULL, ss.str().c_str(), "Mem Summary", 0);
}

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                PSTR szCmdLine, int iCmdShow)
{
DWORDLONG a;
Game g;
g.CheckMemory(a);

std::fstream fs("test.txt", std::fstream::in | std::fstream::out | std::fstream::app);

fs << a << std::endl;

fs.close();

return 0;
}

【问题讨论】:

  • 请发布您正在使用的代码的简短 sn-p,这听起来很奇怪。
  • 已编辑以包含代码。我正在将值输出到 .txt 文件并通过消息框。
  • 硬件故障和热插拔似乎是可能的原因。

标签: c winapi memory memory-management


【解决方案1】:

您必须在调用函数之前初始化MEMORYSTATUSEXdwLength 成员。

MEMORYSTATUSEX status;
status.dwLength = sizeof(status);
GlobalMemoryStatusEx(&status);

你应该在对结构做任何事情之前检查它的返回值。

【讨论】:

  • 糟糕,我正在阅读的这本书看起来有点过时,并且没有包含此内容。我现在得到了预期的结果。谢谢!
【解决方案2】:

您确定输出正确的字段吗?您列出的第一个数字大约是 55 GB,如果您只有 4GB 的内存,这将没有多大意义。

【讨论】:

    【解决方案3】:

    如 msdn 帮助中所述: 您可以使用 GlobalMemoryStatusEx 函数来确定您的应用程序可以分配多少内存,而不会严重影响其他应用程序。

    GlobalMemoryStatusEx 函数返回的信息是不稳定的。无法保证对该函数的两次连续调用将返回相同的信息。

    lpBuffer 中 MEMORYSTATUSEX 结构的 ullAvailPhys 成员包括所有 NUMA 节点的内存。

    所以在不同的调用中返回值可以不同,这是正确的答案。

    【讨论】:

      猜你喜欢
      • 2023-03-03
      • 2011-01-12
      • 2018-03-02
      • 1970-01-01
      • 2010-09-08
      • 1970-01-01
      • 2010-09-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多