LINUX.ORG.RU

C++ жадина или я дурак? (проблема с delete)

 , ,


0

4

Случилось страшное, убил весь день и вечер, не смог разобраться сам. Пересел с Си на Плюсы. Написал для своих задач реализацию листа (ниже полный листинг), все компилится и робит, но жрет память, точнее не отдает ее ОС после удаления узла из списка, судя по таск менеджеру, а только лишь после выхода. В чем может быть дело, друзья, что я делаю не так?:)

namespace Brevity {

    template <class T> class List {

    public:

        List();
        ~List();
        void add(T data);
        bool remove(size_t ind);
        bool swap(size_t src, size_t dst);
        size_t count();
        T *get(size_t ind);

    private:

        class Node {

        public:
            Node(T data);
            T data;
            Node *prev;
            Node *next;

        };

        Node *head;
        size_t length;
        Node *getNode(size_t ind);

    };

    template <class T> List<T>::Node::Node(T data) {
        this->data = data;
        this->prev = NULL;
        this->next = NULL;
    }

    template <class T> List<T>::List() {
        this->length = 0;
        head = NULL;
    }

    template <class T> List<T>::~List() {
        while (this->length > 0) {
            this->remove(0);
        }
    }

    template <class T> void List<T>::add(T data) {
        List::Node *newNode = new List::Node(data);
        if (this->length == 0) {
            newNode->prev = newNode;
            newNode->next = newNode;
            this->head = newNode;
        } else {
            newNode->prev = this->head->prev;
            newNode->next = this->head;
            this->head->prev->next = newNode;
            this->head->prev = newNode;
        }
        this->length++;
    }

    template <class T> bool List<T>::remove(size_t ind) {
        List::Node *curNode = List::getNode(ind);
        if (curNode == NULL) {
            return false;
        } else {
            if (ind == 0) {
                this->head = curNode->next;
            }
            if (this->length > 1) {
                curNode->prev->next = curNode->next;
                curNode->next->prev = curNode->prev;
            }
            delete curNode;
            this->length--;
            return true;
        }
    }

    template <class T> bool List<T>::swap(size_t src, size_t dst) {
        List::Node *srcNode, *dstNode;
        srcNode = List::getNode(src);
        dstNode = List::getNode(dst);
        if (srcNode == NULL || dstNode == NULL) {
            return false;
        } else {
            T tmp;
            tmp = srcNode->data;
            srcNode->data = dstNode->data;
            dstNode->data = tmp;
            return true;
        }
    }

    template <class T> typename List<T>::Node* List<T>::getNode(size_t ind) {
        if (this->length <= ind) {
            return NULL;
        } else {
            List::Node *curNode;
            size_t curInd;
            int increment;
            if (ind <= (size_t) (this->length / 2)) {
                curNode = this->head;
                curInd = 0;
                increment = 1;
            } else {
                curNode = this->head->prev;
                curInd = this->length - 1;
                increment = -1;
            }
            while (curInd != ind) {
                curNode = (increment > 0) ? curNode->next : curNode->prev;
                curInd += increment;
            }
            return curNode;
        }
    }

    template <class T> size_t List<T>::count() {
        size_t count = this->length;
        return count;
    }

    template <class T> T *List<T>::get(size_t ind) {
        return &List::getNode(ind)->data;
    }

}

int main(){

    Brevity::List <size_t > myList;
    for (size_t i = 0; i < 10000000; ++i) {
        myList.add(i);
    }

    for (size_t i = 0; i < 10000000; ++i) {
        myList.remove(0);
    }

    char a;
    std::cin >> a;

    for (int i = 0; i < myList.count(); ++i) {
        std::cout << *myList.get((size_t) i) << " ";
    }

}


Последнее исправление: zasyadko (всего исправлений: 2)
Ответ на: комментарий от anonymous

Ты просто процитировал надпись на общеизвестном сайтишке

Сказал анон на никому не известном сайтишке. Это не SO цитирует ЛОР, это ЛОР цитирует SO.

стандарт цепепе, которым так кичатся цепепе писатели, нигде не предписывает

Стандарт также не говорит что оно должно быть отвязано от malloc, этим и пользуются все.

Прочитав тех же Страуструпа и Саттера, ты обнаружишь для себя, что эти известные авторы гайдлайнов и прочих «стандартов кодирования» также говорят о new/delete как о неких абстрактных операторах выделения/высвобождения оперативной памяти

Они не запрещают абстракциям юзать системные вызовы malloc/free. А если ты не знаешь на чем базируется абстракция на твоей системе - то нельзя говорить о понимании чего либо.

Случай описываемый на «общеизвестном сайтишке» покрывает glib*, CLang, Apache and MSFT. Это 99.999% всех систем на которых можно что-либо писать. Кукарекать о «а вот на распберри собранной с помощью паяльника из жопы и библиотеки github.com/xxxxx new базируется на HeapAlloc» глупо.

PPP328 ★★★★★
()
Ответ на: комментарий от PPP328

Стандарт также не говорит что оно должно быть отвязано от malloc, этим и пользуются все.

Смотрю, ты неумело изворачиваешься :-) Попытка вывернуть наизнанку официальный документ по цепепе, приводя в качестве доводов частные случаи, вещая о каких-то 99 процентах выглядит глупо и непрофессионально, мягко говоря :-)

Кукарекать о «а вот на распберри собранной с помощью паяльника из жопы и библиотеки github.com/xxxxx new базируется на HeapAlloc» глупо.

Это да, так и есть :-) Глупо :-) Ведь кроме тебя никто ни о какой распберри здесь не говорит :-) Тебе по стандарт, а ты в ответ про glib и распбери пи :-) Всё, как бы, ясно :-) Лол :-)

anonymous
()
Ответ на: комментарий от PPP328

абстракциям юзать системные вызовы malloc/free

Вам лучше не подходить к си и плюсам. Нет таких сисколов на большинстве систем. Есть sbrk и mmap или аналоги. malloc/free реализованы в конкретной libc.

grossws
()
Ответ на: комментарий от grossws

Под системными вызовами я подразумеваю вызов из системных библиотек в отличие от пользовательских библиотек.

PPP328 ★★★★★
()
Ответ на: комментарий от PPP328

из системных библиотек в отличие от пользовательских библиотек

Странное разделение, трудно провести границу.

i-rinat ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.