Skip to content

Commit c3cd945

Browse files
committed
fix: resolve memory leak in LRUCache implementation
1 parent f7076bb commit c3cd945

File tree

1 file changed

+22
-3
lines changed

1 file changed

+22
-3
lines changed

cpp/Linked Lists/lru_cache.cpp

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,20 @@ class LRUCache {
2525
head->next = tail;
2626
tail->prev = head;
2727
}
28+
// Destructor: Cleans up dynamically allocated resources
29+
// to prevent memory leaks. Implemented if time permits
30+
// during an interview.
31+
~LRUCache() {
32+
// Delete all nodes in the linked list.
33+
DoublyLinkedListNode* current = head;
34+
while (current != nullptr) {
35+
DoublyLinkedListNode* nextNode = current->next;
36+
delete current;
37+
current = nextNode;
38+
}
39+
// Clear the hashmap.
40+
hashmap.clear();
41+
}
2842

2943
int get(int key) {
3044
if (hashmap.find(key) == hashmap.end()) {
@@ -41,15 +55,20 @@ class LRUCache {
4155
// If a node with this key already exists, remove it from the
4256
// linked list.
4357
if (hashmap.find(key) != hashmap.end()) {
44-
removeNode(hashmap[key]);
58+
DoublyLinkedListNode* existingNode = hashmap[key];
59+
removeNode(existingNode);
60+
delete existingNode;
61+
hashmap.erase(key);
4562
}
4663
DoublyLinkedListNode* node = new DoublyLinkedListNode(key, val);
4764
hashmap[key] = node;
4865
// Remove the least recently used node from the cache if adding
4966
// this new node will result in an overflow.
5067
if (hashmap.size() > capacity) {
51-
hashmap.erase(head->next->key);
52-
removeNode(head->next);
68+
DoublyLinkedListNode* lruNode = head->next;
69+
hashmap.erase(lruNode->key);
70+
removeNode(lruNode);
71+
delete lruNode;
5372
}
5473
addToTail(node);
5574
}

0 commit comments

Comments
 (0)