Я написал небольшой класс очереди на C ++, на Windows.
Просто чтобы проверить, я выделяю 1,0000,000 int
с и читаю их обратно.
Очередь работает правильно и очень быстро, но проблема в том, что после полного освобождения диспетчер задач сообщает об использовании некоторой памяти. Например, я все еще получаю 2 МБ памяти, хотя все эти целые числа приводят к + 400 МБ памяти.
Я думал, что это из-за того, что операционная система не выполняет какой-либо GC или что-то еще, но теперь я обнаружил, что это значение (2 МБ) становится 13 МБ, когда я выделяю 100 000 000 целых чисел (в 10 раз больше предыдущего числа). Я не могу найти утечку.
Вот код; как видите, я освобождаю все:
#pragma once
#include <exception>
template <class T>
class colist_item
{
public:
colist_item() { }
~colist_item() { }
T value;
colist_item *next;
};
template <class T>
class colist
{
public:
colist() { this->m_root = NULL; this->m_count = 0; }
~colist() { }
void enqueue(T value);
T dequeue();
T *peek();
int count();
private:
colist_item<T> *m_root;
int m_count;
};
template <class T>
void colist<T>::enqueue(T value)
{
if (this->m_root == NULL) {
this->m_root = new colist_item<T>();
this->m_root->value = value;
this->m_root->next = NULL;
} else {
colist_item<T> *tempitem = new colist_item<T>();
tempitem->value = value;
tempitem->next = this->m_root;
this->m_root = tempitem;
}
this->m_count++;
}
template <class T>
T colist<T>::dequeue()
{
if (this->m_root == NULL) {
throw std::exception();
} else {
T retval = this->m_root->value;
colist_item<T> *next = this->m_root->next;
delete this->m_root;
this->m_root = next;
this->m_count--;
return retval;
}
}
template <class T>
T *colist<T>::peek()
{
if (this->m_root == NULL) {
return NULL;
} else {
T retval = this->m_root->value;
return &retval;
}
}
template <class T>
int colist<T>::count()
{
return this->m_count;
}
Main:
#include <iostream>
#include <limits>
#include "colist.h"
#include <time.h>
const int kNumItems = 100000000;
using namespace std;
void puttest(colist<int> *list)
{
for(int i = 0; i < kNumItems; i++)
list->enqueue(i);
}
void readtest(colist<int> *list)
{
for(int i = 0; i < kNumItems; i++)
list->dequeue();
}
int main(int argc, char *argv[])
{
colist<int> list;
cout << "Testing with : " << kNumItems << " elements" << endl;
clock_t start = clock();
puttest(&list);
clock_t end = clock();
double ms = ((end - start));
cout << "puttest: " << ms << endl;
start = clock();
readtest(&list);
end = clock();
ms = ((end - start));
cout << "readtest: " << ms << endl;
cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
}