【发布时间】:2025-11-28 03:15:02
【问题描述】:
我正在尝试消除内存泄漏的代码,但不能完全确定泄漏的确切来源。
void insertHead(T value){
if(!duplicateCheck(value)){
length++;
if(head == NULL){
head = new Node(value);
}else{
Node *temp = head;
head = new Node(value);
head->next = temp;
}
}
}
void insertTail(T value){
if(!duplicateCheck(value)){
// create the node
if(head == NULL){// insert at the insertHead
insertHead(value); //head = newNode;
}else{// Iterators through the linked list until a null is found
length++;
Node *fakeIterator = head; // once found sets the null val to newNode
while(fakeIterator->next != NULL){
fakeIterator = fakeIterator->next;
}
fakeIterator->next = new Node(value);
}
}
}
void insertAfter(T value, T insertionNode){ // seg faulting because it cant find the object oadd after
if(!duplicateCheck(value)){
Node *fakeIterator = head;
while (fakeIterator != NULL) {
if (fakeIterator->value == insertionNode) {
Node *newNode = new Node(value);
newNode->next = fakeIterator->next;
fakeIterator->next = newNode;
length++;
break;
}
fakeIterator = fakeIterator->next;
}
}
}
void clear(){
Node *fakeIterator = head;
while(fakeIterator!=NULL){
delete head;
fakeIterator = fakeIterator->next;
head = fakeIterator;
}
head = NULL;
length = 0;
}
Clear 函数在解构器中调用,main 的目的是删除每个节点。我使用了 valgrind,它说所有插入方法都丢失了内存,但我还是不确定在哪里。如果需要,我可以发布 valgrind 输出
【问题讨论】:
-
提示:在 C++ 中使用
nullptr而不是NULL。 -
值得注意的是你的
delete你的fakeIterator在clear()然后继续使用那个被删除的对象。那是未定义的行为,一个释放后使用的错误。捕获fakeIterator->next在你删除之前。 -
强烈考虑使用
std::unique_ptr和std::make_unique()而不是带有new和delete的原始指针。 -
如果
head不是NULL,Clear()具有未定义的行为。它所做的第一件事是delete head,它使fakeIterator无效,因此在赋值fakeIterator = fakeIterator->next中访问fakeIerator->next会产生未定义的行为。 -
@tadman @Peter 这会更好吗?我想我需要阅读更多关于 LinkedLists 和内存管理的内容
while(fakeIterator!=NULL){ fakeIterator = fakeIterator->next; delete head; head = fakeIterator; }
标签: c++ memory-leaks valgrind