《游戏编码完成》第四版,第5章(游戏初始化和关闭),“ 检查内存”部分包含以下有趣的代码示例:
bool CheckMemory(const DWORDLONG physicalRAMNeeded, const DWORDLONG virtualRAMNeeded)
{
MEMORYSTATUSEX status;
GlobalMemoryStatusEx(&status);
if (status.ullTotalPhys < physicalRAMNeeded)
{
// you don’t have enough physical memory. Tell the player to go get a
// real computer and give this one to his mother.
GCC_ERROR("CheckMemory Failure: Not enough physical memory.");
return false;
}
// Check for enough free memory.
if (status.ullAvailVirtual < virtualRAMNeeded)
{
// you don’t have enough virtual memory available.
// Tell the player to shut down the copy of Visual Studio running in the
// background, or whatever seems to be sucking the memory dry.
GCC_ERROR("CheckMemory Failure: Not enough virtual memory.");
return false;
}
char *buff = GCC_NEW char[virtualRAMNeeded];
if (buff)
{
delete[] buff;
}
else
{
// even though there is enough memory, it isn't available in one
// block, which can be critical for games that manage their own memory
GCC_ERROR("CheckMemory Failure: Not enough contiguous memory.");
return false;
}
}
这引起了一些问题。
第一部分仅询问OS(Windows)有多少物理RAM可用。奇怪的是第二部分,它分配了大量的内存并立即释放它:
char *buff = GCC_NEW char[virtualRAMNeeded];
if (buff)
{
delete[] buff;
}
作者继续解释:
...该函数分配并立即释放巨大的内存块。这样可以使Windows清理内存管理器中累积的所有垃圾,并仔细检查是否可以分配所需的连续块。如果调用成功,那么实际上您已经在系统内存中运行了相当于Zamboni机器的设备,从而为您的游戏做好了准备……
但我对此保留意见。
“清除内存管理器中累积的垃圾吗?” 真?如果游戏才刚刚开始,就应该没有垃圾吗?
“确定可以分配一个连续的块吗?” 在非常特殊的情况下,您将自己管理内存,这会使它们有意义,但是,即使您确实分配了很多内存,蝙蝠也几乎使其他任何应用程序都无法在其中运行开启系统时。
此外,这是否可能迫使操作系统提交所有这些内存,并因此将大量内存移出交换磁盘空间,从而大大降低了应用启动速度?
这真的是一个好习惯吗?
operator new
for 的结果nullptr
)说。那本书可以做的最好的事情就是点燃烟囱。分配和释放大块内存当然不会 “清理”内存。
new
运算符重载为返回null而不是throw bad_alloc
。如果没有,那么是的,此代码甚至更荒谬:P
operator delete
也必须接受nullptr
并将其视为无操作。任何不这样做的全局重载都将被破坏。这意味着这都是荒谬的。就像假设分配一个巨大的内存块并释放它会“神奇地”做某件事一样。充其量,它不会造成任何伤害(很可能是因为页面甚至没有被触摸到……否则它可能会从工作集中交换掉一些页面,您稍后需要重新加载)。