我正在使用VC++ 2012。
我想知道当前线程中有多少可用的堆栈内存。

快速搜索指向使用malloc.h和stackavail()函数,但在Visual C++ 2012中不存在。我如何以另一种方式实现此目的?

有问题的示例是这样的:

#include "stdafx.h"
#include <iostream>
#include <malloc.h>

using namespace std;

int _tmain()
{
    cout << "Available stack: " << stackavail() << std::endl;
}

最佳答案

这使用一些堆栈,但是是线程安全的,不需要内联asm。我认为我们这些需要跟踪堆栈的人不需要精度。只是对可用于防止溢出发生的可用内容的一个很好的估计。我们需要跟踪它,因为我们为用户提供了创建可能使用递归或其他服务或需求的宏,脚本,表达式等的功能。即使每个环境仅使用所有可用内存,每个环境也应该能够报告堆栈可用性,以便可以控制任何递归。

size_t stackavail()
{
  // page range
  MEMORY_BASIC_INFORMATION mbi;
  // get range
  VirtualQuery((PVOID)&mbi, &mbi, sizeof(mbi));
  // subtract from top (stack grows downward on win)
  return (UINT_PTR) &mbi-(UINT_PTR)mbi.AllocationBase;
}

09-06 22:08