【问题标题】:Displaying the amount of memory allocated显示分配的内存量
【发布时间】:2011-01-19 13:12:24
【问题描述】:

嗨 我正在编写一些测试内容,以查看分配的内存量是否正确显示

在 Windows 任务管理器中。下面是代码;

int main(int argc,char* argv[])
{
 struct stat st;
 char commandXCopy[200];
 char commandDelete[200];

 char *fNames[2^16];
 int i =0;
    char *ptr = (char *)malloc(sizeof(char) * 2^32);
     printf("\nTEST");

    if(!ptr)
            printf("\nCan not allocate");
    else
            printf("\nMemory allocate");


     while(1==1)
     {
     };

我尝试从堆栈和堆中进行大量分配。但是我在任务管理器上看到的所有 -> 进程是 ~800K。

我也没有看到“无法分配”的消息。

我有 Windows 32bit XP Pro 并且使用 gcc 并且应用程序是一个 dos 应用程序。

gcc 测试.c

问候

【问题讨论】:

    标签: c windows memory-management


    【解决方案1】:

    我认为您可能会误解:2^32not 232(4G,假设您的字节长度为 8 位,我会为此答案的目的)在 C 中。

    ^ 是按位异或运算符。所以你实际分配的是:

         binary        hex     decimal
        ---------      ----    -------
        0010 0000      0x20      32
    xor 0000 0010      0x02       2
        =========
        0010 0010      0x22      34
    

    或 34 个字节。同样,2^31 会给你 29 个字节,所以你可能认为应该是 2G 的差异(232 - 231)实际上只有 5 个字节。

    如果你想在 C 语言中发挥作用,你应该看看 pow() 函数,但我怀疑你是否能够获得 4G 内存(也许在 64 位操作系统上,但即便如此,这也太可怕了)。

    还有一件事:sizeof(char) 总是 1 - 没有必要乘以它。

    【讨论】:

    • 另一方面..当我将代码更改为此 char *ptr = (char *)malloc(sizeof(char) *pow(2,30));我的任务管理器里还有 840K。为什么?
    • 我几乎可以保证这是因为分配实际上失败,并且失败的分配往往不会占用您的大部分地址空间 :-) 在malloc 看看它是否为 NULL。
    • 否,分配成功。我检查 ptr 是否为 null 并看到消息“内存分配”
    • 然后我会研究这些数字在任务管理器中的实际含义。进程选项卡可能没有用:请参阅en.wikipedia.org/wiki/Windows_Task_Manager :“1/ 进程选项卡上的内存使用列实际上是进程的工作集。进程对其工作集几乎没有直接控制,这使得该列无用确定一个进程消耗了多少内存”和“2/VM Size列(默认不显示)不是进程使用的虚拟内存量;它实际上是进程的私有字节”。
    • 您最好查看 WMI 以获取您需要的信息。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-28
    • 1970-01-01
    • 2017-10-31
    • 2021-12-25
    相关资源
    最近更新 更多