C++, problem med dynamiskt minne
Hej!
Håller på att implementera en länkad lista, bland annat för att lära mig hantera pekare och dynamiskt minne mm.
För varje ny nod som skapas i listan så allokerar jag minne för denna med hjälp av new. För att se hur mycket minne min applikation använder så tittar jag på "Mem usage" i ett system-verktyg liknande "Windows Task Manager" fast för Ubuntu. Jag har gjort att lite test-program för min länkade lista där jag kan bestämma hur många noder jag ska skapa. Om jag exempelvis väljer att skapa en miljon noder så ser jag direkt att minnesanvändingen för min applikation ökar från ca 800 KB till 16 mb. Allt väl så långt. Om jag väljer att ta bort alla noder och köra delete på var och en av dessa så upptar min applikation fortfarande lika mycket minne dvs 16 mb! Varför?
Om jag gör något liknande fast med en dynamisk array så blir det inte så här. Jag tänkte att det kanske var jag som implementerat det hela konstigt så jag valde att skriva av ett exempel på en länkad lista från min bok men det gjorde ingen skillnad alls.
Problemet ovan verkar vara relaterat till Operativsystemet. Jag gjorde testerna som jag beskrev ovan i Ubuntu (Linux dist). Testar jag samma program i Windows så lämnar min applikation nästan tillbaks allt minne. Min fråga är då varför det är så här? Om jag kör delete så är det ju för att jag inte längre behöver använda minnet...
Så här såg det ut innan jag allokerade minne i Windows:
Memory used: 960 k
Efter att jag allokerat minne för 1 miljon noder:
Memory used: 16652 k
Efter att jag tagit bort allt allokerat minne för noderna:
Memory used: 1108 k
Känns ju som ett litet minnesläckage? Blir inte mycket klokare, snarare mer förtvivlad...
Nedan följer den förenklade versionen av mitt program med en länkad lista..
Node.h
#ifndef NODE_H
#define NODE_H
namespace linkedlistofclasses
{
class Node
{
public:
Node( );
Node(int value, Node *next);
int getData( ) const;
Node *getLink( ) const;
void setData(int value);
void setLink(Node *next);
private:
int data;
Node *link;
};
typedef Node* NodePtr;
}
#endif // NODE_H
Node.cpp
#include <iostream>
#include "Node.h"
namespace linkedlistofclasses
{
Node::Node( ) : data(0), link(NULL)
{
//
}
Node::Node(int value, Node *next) : data(value), link(next)
{
//
}
int Node::getData( ) const
{
return data;
}
Node* Node::getLink( ) const
{
return link;
}
void Node::setData(int value)
{
data = value;
}
void Node::setLink(Node *next)
{
link = next;
}
}
main.cpp (test program)
#include <iostream>
#include "Node.h"
using namespace std;
using namespace linkedlistofclasses;
void head_insert(NodePtr &head, int the_number)
{
NodePtr temp_ptr;
temp_ptr = new Node(the_number, head);
head = temp_ptr;
}
int main()
{
NodePtr head, temp = NULL;
int size = 0;
char input = ' ';
head = new Node(0, NULL);
cout << "Please enter number of elements: ";
cin >> size;
for (int i = 0; i < size; i++)
{
head_insert(head, i);
}
cout << "Delete the nodes? ";
cin >> input;
temp = head;
while (temp != NULL)
{
NodePtr nodeToDelete = temp;
temp = temp->getLink();
delete nodeToDelete;
nodeToDelete = NULL;
}
cout << "Nodes deleted...";
cin >> input;
return 0;
}