感谢您的回复和回答。这个问题被编辑了,因为看起来我之前的所有问题都非常模糊,并没有详细说明我想要达到的目标和目标。
更新了问题:
在Linux平台中使用C语言,有哪些可能的方法来确定我的应用程序中使用的堆的大小。比如.. ..
void printHeapReport( )
{
/* implementation here to print the heap size */
}
int main()
{
char *ptemp = NULL;
p = (char*)malloc( 10 ); /* 10 bytes */
printHeapReport();
return 0;
}
应用程序将在标准输出屏幕中输出:
Debug Report:
--------------
Heap: 10 bytes
--------------
我问这个是因为我想在应用程序中创建一个打印堆大小的调试报告。
请建议。
非常感谢。
旧问题:
使用C asm内联函数,是否可以知道堆的起始地址和堆的结尾?也是程序结束的地址?
asm( <assembly code> );
因此,使用此代码,我可以确定应用程序中使用的堆的大小。这种方法对于确定堆的大小是否有效?
请建议。
非常感谢。
答案 0 :(得分:4)
您必须至少指定您正在处理的平台,并在许多平台上实现这个问题并没有真正的答案。 'heap'不需要是连续的 - 在很多情况下,对于不同类型的对象(如某些大小的请求)将有几个堆,并且运行时可能根据需要从底层OS获取“堆”的块
类似于“程序” - 可执行文件的各个部分可能散布着数据,或者地址空间中没有任何内容的区域。
答案 1 :(得分:3)
装配完全没用。如果系统的标准库实现公开了一个存储堆顶部地址的变量,那么您可以在不使用asm的情况下轻松访问它。否则,您可能能够访问和处理特定于操作系统的流程数据,例如(在Linux上)/proc/self/smaps
,以确定程序的地址布局。但无论如何, asm不会帮助你。
答案 2 :(得分:2)
如果您的标准库是glibc(可能),那么您可以#include <malloc.h>
并致电malloc_stats();
将堆报告打印到stderr
。