C ++找出正在使用的dynamic内存

嗨,先谢谢你的帮助。

首先,这是一个功课,但我已经做了几乎所有我需要的东西。 我们被要求实现一个链表类,做一些添加和删除,并计算它的内存使用情况。

我已经完成了列表,并添加和删除(从文本文件)。 所有这一切都完成了。 但是,我坚持计算内存使用情况。

我一直在寻找一个简单的方法来做到这一点,我什么都没有find。 我真正需要的是一些方法,将返回使用的dynamic内存量。 就这样。 我发现了几个工具来查找内存泄漏,但我认为他们只是为了我所需要的。

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

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

编辑

这正是老师要求我们做的(西class牙语翻译):

“每次加载操作(从文本文件,无关)实现,程序应该显示有多less内存可用在堆(内存分配),多less可用的文件加载之前。

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

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(); 

在他们身上做记忆计数魔法。 另请参见如果我已经超载了,我怎样称呼原来的“operator new”?

另请参见如何在运行时获得内存使用情况在c + +?

我发现GetProcessMemoryInfo函数(Windows)

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

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

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

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

在Linux下你可以查询/ proc / PID / statm

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

你可以重载全球运营商新的和删除,并保持跟踪。

尽可能地从老师的问题出发 ,可以使用HeapWalk功能来完成这个任务 。 这使您可以在您选择的堆中计算可用空间和已用空间(可能需要进程默认堆,请参阅GetProcessHeap )。

由于堆将根据需要进行扩展(在进程虚拟地址空间和可用虚拟内存的限制之内),这个信息在实际中通常不是特别有用的。 但它可能会满足您的需求。

那么,你的问题的解决方案真的取决于你究竟要做什么。 应用程序的整体内存使用情况与链接列表正在使用的内存之间存在很大差异。 如果您需要知道您的链接列表正在使用多少内存,则必须按单个节点的大小来多个节点。 这里是一个简单的例子(在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。 但是这里有一个很好的问答环节,可以帮助您解决平台问题并解决这个问题 – 如何从一个进程中确定CPU和内存消耗?

你的老师很可能想要你做简单的事情。 但是如果你们两个都做,那只会对你有好处。

祝你好运!