我已经实现了一个链表。为了测试这个内存泄漏列表,我还写了一个测试用例:
#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 诊断工具查找了内存使用情况。视觉效果如下图所示:
我对这个图表感到有点困惑,因为有时它会击中零行(显然它不完全为零但非常接近它),但有时似乎有一个巨大的 > 100 MB
的内存泄漏。在测试结束时,> 100 MB
内存泄漏仍然存在..
你能解释一下为什么我有时会在图表中出现泄漏,有时候却没有?
我不希望你发现我的内存泄漏,但解释为什么图表不合适会很好。
金字塔顶部平坦的事实也让我感到困惑。分析器是否不准确?