快速分配链表和缓慢释放

时间:2013-06-12 20:58:03

标签: c++ memory-management data-structures linked-list

我是C ++新手,我遇到了一个令人沮丧的问题 -

我有这个模板化的LinkedList实现:

template <typename U>
class LinkedList : std::iterator<std::input_iterator_tag, U> {
public:
    struct Node {
    friend LinkedList;
        U content;
        Node* getNext() { return next; };
    private:
        Node* next;
        Node* prev;
    };

    LinkedList() : head(NULL), tail(NULL) { };
    ~LinkedList() {
        Node * current = tail;
        while(current != NULL) {
            Node* temp = current;
            current = current->prev;
            delete temp;
        }
    };
    Node* getHead() { return head; }
    Node* getTail() { return tail; }
    bool append(U content) {
        Node* node = new Node();
        if(node == NULL) return false;

        node->content = content;
        if(tail == NULL) {
            tail = head = node;
        } else {
            tail->next = node;
            node->prev = tail;
            tail = node;
        }

        return true;
    };

bool remove(U* cont) {
    if(tail == NULL) return false;

    if(cont != NULL) *cont = tail->content;

    Node *temp = tail;
    if(tail == head) {
        tail = NULL;
        head = NULL;
    } else tail = temp->prev;
    delete temp;
    return true;
};
private:
    Node *head, *tail;
};

我针对它运行以下代码:

char c1, c2;
cout << "start allocation" << endl;

LinkedList<int>* list = new LinkedList<int>();

for(ULONGLONG i = 0; i < 1e5; i++) {
    list->append(0);
}

cout << "allocation complete" << endl;

cin >> c1;

cout << "start deleting" << endl;

delete list;

cout << "done deleting" << endl;

cin >> c2;

cout << c2 << endl; // don't optimize read key away

因此它分配100,000个int节点然后将它们全部删除。为所有节点分配空间几乎是瞬时的,而删除它们需要大约10秒。我做了一件明显不对的事吗?

2 个答案:

答案 0 :(得分:3)

这可能是运行时库如何释放内存的工件。在分配期间,为每个节点项找到一个块可能只是一些操作来占用主池,并将其分成两部分并返回较小的部分以供程序使用。释放该块可能包括遍历一个空闲列表,看看这些小分配是否可以组合成更大的空闲块。

答案 1 :(得分:0)

尝试在Release模式下运行而不是Debug。

在调试模式下,释放块时,运行时将进行大量的健全性检查,以确保您没有覆盖您不拥有的内存,并且还会清除释放的内存内容。在Release中,所有这些开销都消失了。

(请注意,我假设您正在使用Dev Studio。其他平台有不同的规则来启用内存检查,但您的问题听起来与我在调试模式下使用Dev Studio的经历非常相似。)