我是否有内存泄漏,内存分析器不准确或两者兼而有之?

时间:2015-12-14 17:33:46

标签: c memory memory-leaks profiler

我已经实现了一个链表。为了测试这个内存泄漏列表,我还写了一个测试用例:

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

typedef struct node
{
    struct node* NextNode;
    struct node* PreviousNode;
    void* Data;
} Node;

typedef struct list
{
    Node* Head;
    Node* Last;
    int Length;
} List;

void NodeFree(Node* node)
{
    free(node);
}

void TestSuite(char* testName, bool(*testCaseDelegate)())
{
    printf("Test: %s\n", testName);
    bool result = testCaseDelegate();
    if (result)
    {
        printf("Test: passed!\n");
    }
    else
    {
        printf("Test: failed!\n");
    }
}
void ListAdd(List* list, Node* node)
{
    if (list->Head == NULL)
    {
        list->Head = node;
        list->Last = node;
    }
    else
    {
        list->Last->NextNode = node;
        list->Last = node;
    }

    list->Length++;
}

List* ListNew()
{
    List* list = malloc(sizeof(List));
    list->Head = NULL;
    list->Last = NULL;
    list->Length = 0;
    return list;
}

Node* NodeNew(Node* prevNode, void* data)
{
    Node* node = malloc(sizeof(Node));
    node->NextNode = NULL;
    node->PreviousNode = prevNode;
    node->Data = data;

    if (prevNode)
    {
        prevNode->NextNode = node;
    }

    return node;
}

void ListFree(List* list)
{
    Node* actual = list->Head;
    Node* next;
    while (actual)
    {
        next = actual->NextNode;
        NodeFree(actual);
        actual = next;
    }

    free(list);
}


bool ListTestAllocation()
{
    const int testRuns = 20;
    const int testNumber = 10000000;
    int testRunCount = 0;
    for (testRunCount; testRunCount != testRuns; testRunCount++)
    {
        List* list = ListNew();
        int counter = 0;
        for (counter; counter != testNumber; counter++)
        {
            ListAdd(list, NodeNew(list->Last, (void*)counter));
        }

        ListFree(list);
    }

    return false;
}

void ListTest()
{
    TestSuite("List Allocation", ListTestAllocation);
}

int main(int argc, const char* argv[])
{
    ListTest();
}

我已经使用Visual Studio 2015 Enterprise 诊断工具查找了内存使用情况。视觉效果如下图所示:

Diagnostic tool output

我对这个图表感到有点困惑,因为有时它会击中行(显然它不完全为零但非常接近它),但有时似乎有一个巨大的 > 100 MB的内存泄漏。在测试结束时,> 100 MB内存泄漏仍然存在..

你能解释一下为什么我有时会在图表中出现泄漏,有时候却没有?

不希望你发现我的内存泄漏,但解释为什么图表不合适会很好。

金字塔顶部平坦的事实也让我感到困惑。分析器是否不准确?

0 个答案:

没有答案