如何使用vc ++找出当前线程堆栈上剩余的空间?

时间:2012-10-15 23:15:44

标签: c++ visual-c++

我正在使用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;
}

3 个答案:

答案 0 :(得分:3)

这使用了一些堆栈,但是是线程安全的,不需要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;    
}

答案 1 :(得分:1)

在C ++中没有stackavail()这样的函数,尽管有些编译器,例如“Open Watcom C ++”将它作为扩展提供。

如果确实需要知道此信息,请使用特定于操作系统的系统调用来解决此问题。

答案 2 :(得分:1)

好的,所以这些是我迄今为止的调查结果。

在Windows上通过vc ++检查堆栈空间没有简单的功能方法。

但我找到了答案elsewhere

size_t stackavail()
{
    static unsigned StackPtr;   // top of stack ptr
    __asm mov [StackPtr],esp    // mov pointer to top of stack
    static MEMORY_BASIC_INFORMATION mbi;        // page range
    VirtualQuery((PVOID)StackPtr,&mbi,sizeof(mbi)); // get range
    return StackPtr-(unsigned)mbi.AllocationBase;   // subtract from top (stack grows downward on win)
}

此外:

在windows / vc ++中,默认情况下,每个线程的堆栈空间设置为1MB。 要为main()线程设置更高,你必须通过/ STACK的链接器标志进行编译:####舍入到最接近的4. Ex:/ STACK:2097152用于2MB堆栈。

希望这有助于某人。