Неполное высвобождение памяти

131
29 ноября 2020, 15:10

Есть задача - реализовать двусвязный список(хранимые значения - целые числа) при помощи структур. При заполнении списка 10^7 значениями память программы доходит примерно до 580МБ. Затем вызывается функция очистки списка, и память программы снижается до ~16-17МБ.(Память смотрю внутри VS). Что это за оставшаяся память? Я проверял, вызовов new и delete при очистке списка одинаковое количество. Интересен тот факт, что если провернуть такую штуку со встроенным списком, то останется 7-8МБ памяти.

Вот вид моей структуры двусвязного списка:

struct doubly_linked_list{
struct list_node
{
    int value;
    list_node* next = nullptr;
    list_node* prev = nullptr;
    ~list_node() = default;
};
list_node* head = new list_node;
list_node* tail = head;
int size = 0;

Это функция очистки:

void doubly_linked_list::clear(){
for(list_node* current = tail->prev; current != nullptr; current = current->prev)
{
    delete current->next;
}
head->next = nullptr;
tail = head;
size = 0;}

Функция добавления в конец списка:

void doubly_linked_list::add_last(int value){
list_node* new_node = new list_node;
new_node->value = value;
tail->next = new_node;
new_node->prev = tail;
tail = new_node;
size++;}

Полный код: doubly_linked_list.h:

#include <iostream>
#include <random>
#include <time.h>

struct doubly_linked_list
{
    struct list_node
    {
        int value;
        list_node* next = nullptr;
        list_node* prev = nullptr;
        ~list_node() = default;
    };
    list_node* head = new list_node;
    list_node* tail = head;
    int size = 0;
    void add_last(int value);
    void clear();
};
doubly_linked_list* create_random_list(int size, unsigned int  min, unsigned int max);
int get_random(unsigned int  min, unsigned int max);

doubly_linked_list.cpp:

void doubly_linked_list::add_last(int value)
{
    list_node* new_node = new list_node;
    new_node->value = value;
    tail->next = new_node;
    new_node->prev = tail;
    tail = new_node;
    size++;
}
void doubly_linked_list::clear()
{
    for(list_node* current = tail->prev; current != nullptr; current = current->prev)
    {
        delete current->next;
    }
    head->next = nullptr;
    tail = head;
    size = 0;
}
doubly_linked_list* create_random_list(int size, unsigned min, unsigned max)
{
    srand(time(nullptr));
    doubly_linked_list* list = new doubly_linked_list;
    for (int index = 0; index < size; index++)
        list->add_last(get_random(min, max));
    return list;
}
int get_random(unsigned int  min, unsigned int max)
{
    return rand() % (max - min) + min;
}

main.cpp:

#include "doubly_linked_list.h"
int main()
{
    doubly_linked_list* test = create_random_list(10000000, 10, 100);
    test->clear();
    system("pause");
    return 0;
}
READ ALSO
Расчет стоимости на jquery

Расчет стоимости на jquery

Данный калькулятор рассчитывает цену проката авто в зависимости от сезона, на каждый из 3 сезонов задано 5 разных ценМне нужно усложнить его,...

136
Адаптивность в jquery

Адаптивность в jquery

Например есть такой плагин mmenu, как сделать чтобы он срабатывал только на определенной ширине экрана? подобно медиа запросам в css нашла вот...

97
Форма bootstrap перекрывает интер. карту яндекс

Форма bootstrap перекрывает интер. карту яндекс

При этом,если в медизапросе убрать высоту (на скрине справа - elements), то не перекрывает

117
Как добавить пролистывание?

Как добавить пролистывание?

Есть выдвижной чатик с ответами на вопросы и надо добавить справа (в раскрытом виде) возможность пролистывать этот чатВот какая штука нужна...

112