C ++找出正在使用的动态内存

时间:2012-03-04 22:36:19

标签: c++ windows memory-management

您好,感谢您的帮助。

首先,这是作业,但我几乎完成了我需要的一切。我们被要求实现一个链表类,对它进行一些添加和删除,并计算它的内存使用情况。

我已完成列表,添加和删除(从文本文件中)。所有这一切都已完成。但是,我一直在计算内存使用量。

我一直在寻找一种简单的方法来做到这一点,而我却找不到任何东西。我真正需要的是一些方法,它将返回正在使用的动态内存量。就这样。我找到了几种找到内存泄漏的工具,但我认为它们只是在我需要的顶部。

我还找到了一种方法来查找进程使用的内存量,但我也不需要。我只需要找出所使用的内存总量,就像在任务管理器中一样。

我在Windows 7上使用Virtual Studio。感谢您的帮助!!

修改

这正是老师要求我们做的事情(翻译自西班牙语):

“每次实现加载操作(来自文本文件,无关)时,程序应显示堆中可用的内存量(用于分配的内存),以及加载文件之前可用的内存量。 “

6 个答案:

答案 0 :(得分:3)

我找到了GetProcessMemoryInfo函数(Windows)

http://msdn.microsoft.com/en-us/library/windows/desktop/ms683219(v=vs.85).aspx

当它要求您输入进程ID时使用_getpid()

http://msdn.microsoft.com/en-us/library/t2y34y40.aspx

我自己不使用Windows,但看起来应该可以使用。

在Linux下,您可以查询/ proc / PID / statm

答案 1 :(得分:2)

你真的在想这个。系统要求您查找列表使用的内存。这是列表中所有节点的总和*每个节点及其内容的大小。

答案 2 :(得分:2)

如何手动跟踪记忆?在每个构造函数中:

global_size += sizeof(*this);

并且在每个析构函数中:

global_size -= sizeof(*this);

注意事项:

  • 如果使用继承,则需要确保不要多次计算对象大小。
  • 只会使用上面的代码修改您的结构,而不是任何其他结构,如字符串或数组(尽管如果数组包含您的结构实例,它们仍将被计算在内)。

在任何时间点,global_size都将具有您跟踪的结构所占用的内存量。

或者,您可以替换全局新/删除运算符:

void* operator new(std::size_t) throw (std::bad_alloc);
void* operator new[](std::size_t) throw (std::bad_alloc);
void* operator new(std::size_t, const std::nothrow_t&) throw();
void* operator new[](std::size_t, const std::nothrow_t&) throw();
void operator delete(void*) throw();
void operator delete[](void*) throw();
void operator delete(void*, const std::nothrow_t&) throw();
void operator delete[](void*, const std::nothrow_t&) throw();

并在其中进行记忆计数魔术。另请参阅How do I call the original "operator new" if I have overloaded it?

另见How to get memory usage at run time in c++?

答案 3 :(得分:1)

您可以重载全局运算符new并删除并跟踪它。

答案 4 :(得分:1)

尽可能按照教师的问题,您可以使用HeapWalk功能执行此操作。这允许您计算所选堆中的空闲和已用空间(您可能需要进程默认堆,请参阅GetProcessHeap)。

由于堆将根据需要扩展(在进程虚拟地址空间和可用虚拟内存的约束内),因此实际上这些信息通常不是特别有用。但它可能满足您的需求。

答案 5 :(得分:0)

那么,问题的解决方案实际上取决于您的具体要求。应用程序的总内存使用量与链接列表使用的内存之间存在很大差异。如果您需要知道链接列表使用了多少内存,则必须按单个节点的大小多个节点。这是一个简单的例子(在C中,你需要稍微调整它以使其与C ++兼容):

#include <stdio.h>
#include <stdlib.h>

struct list_node {
    int data;
    /* ... other stuff ... */
    struct list_node *next;
};

int main(void)
{
    int i;
    struct list_node *list;
    struct list_node *node;

    /* Create a single linked list with 5 elements */
    node = list = malloc(sizeof(struct list_node));
    if (!node)
        abort(); /* Not enough memory */
    node->data = 0;

    for (i = 1; i < 5; ++i) {
        node->next = malloc(sizeof(struct list_node));
        if (!node->next)
            abort(); /* Out of memory */
        node = node->next;
        node->data = i;
        node->next = NULL;
    }

    /* Print a list, count a number of nodes, and estimated memory usage. */
    i = 0;
    for (node = list; node != NULL; node = node->next) {
        ++i;
        printf("Node %d\n", node->data);
    }

    printf("%d nodes use %ld bytes of memory (%ld per node).\n",
           i, i * sizeof(struct list_node), sizeof(struct list_node));

    /* TODO: Free resources... */
    return 0;
}

在此示例中,创建了5个节点以形成链接列表。因此,列表所需的内存总量为5 * sizeof(struct list_node)

当然,当您使用malloc()函数分配内存时,它会分配一个额外的空间。例如,它需要在某处存储信息,以便知道为给定指针分配了多少字节以释放它,它还负责对齐,并且可以分配比所需更多的空间,以便下次调用时malloc()记忆已存在。

因此,如果您真的想知道所有这些细节,那么您需要使用特定于操作系统的界面来确定应用程序使用的虚拟内存量。特别是,您需要两个数字 - 创建链接列表之前和之后的内存使用情况。不幸的是,没有标准的API。但是这里有一个很好的Q&amp; A可以帮助你绕过你的平台并解决这个问题 - How to determine CPU and memory consumption from inside a process?

您的老师很可能希望您做一件简单的事情。但如果你同时做到这两点 - 那对你来说只会是一个加分。

祝你好运!