簡體   English   中英

C ++找出正在使用的動態內存

[英]C++ Find out dynamic memory in use

您好,感謝您的幫助。

首先,這是作業,但我幾乎完成了我需要的一切。 我們被要求實現一個鏈表類,對它進行一些添加和刪除,並計算它的內存使用情況。

我已完成列表,添加和刪除(從文本文件)。 所有這一切都已完成。 但是,我一直在計算內存使用量。

我一直在尋找一種簡單的方法來做到這一點,我沒有找到任何東西。 我真正需要的是一些方法,它將返回正在使用的動態內存量。 就這樣。 我找到了幾種找到內存泄漏的工具,但我認為它們只是在我需要的頂部。

我還找到了一種方法來查找進程使用的內存量,但我也不需要。 我只需要找出所使用的內存總量,就像在任務管理器中一樣。

我在Windows 7上使用Virtual Studio。感謝您的幫助!!

編輯

這正是老師要求我們做的事情(翻譯自西班牙語):

“每次實現加載操作(來自文本文件,無關)時,程序應顯示堆中可用的內存量(分配內存),以及加載文件前可用的內存量。”

我找到了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

你真的在想這個。 系統要求您查找列表使用的內存。 這是列表中所有節點的總和*每個節點及其內容的大小。

你手動跟蹤你的記憶怎么樣? 在每個構造函數中:

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 ++中運行時獲取內存使用情況?

您可以重載全局運算符new並刪除並跟蹤它。

盡可能采用教師的問題,您可以使用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和內存消耗?

你的老師很可能希望你做一件簡單的事情。 但是,如果你同時做到這兩點 - 那對你來說只會是一個加分。

祝好運!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM