我是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秒。我做了一件明显不对的事吗?
答案 0 :(得分:3)
这可能是运行时库如何释放内存的工件。在分配期间,为每个节点项找到一个块可能只是一些操作来占用主池,并将其分成两部分并返回较小的部分以供程序使用。释放该块可能包括遍历一个空闲列表,看看这些小分配是否可以组合成更大的空闲块。
答案 1 :(得分:0)
尝试在Release模式下运行而不是Debug。
在调试模式下,释放块时,运行时将进行大量的健全性检查,以确保您没有覆盖您不拥有的内存,并且还会清除释放的内存内容。在Release中,所有这些开销都消失了。
(请注意,我假设您正在使用Dev Studio。其他平台有不同的规则来启用内存检查,但您的问题听起来与我在调试模式下使用Dev Studio的经历非常相似。)