我正在使用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;
}
答案 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堆栈。
希望这有助于某人。