2012-11-19 25 views
3

所以我有一个链接列表得到正确创建,正确链接,但当我试图取消分配内存我似乎无法删除任何节点,该列表仍然存在。 代码为我的列表解构:我不明白我在做什么错我的记忆解除分配

void LL_User::free_memory() { 
    // TODO 
    LL_User_Node *currentNode; 
    currentNode = head; 
    while(currentNode) { 
     LL_User_Node *temp = currentNode; 
     currentNode = currentNode->next; 
     delete temp; 
    } 
    //cout << "LL_User::free_memory() is not implemented yet.\n"; 
} 

LL_User::~LL_User() { 
    if(head == NULL) { 
     return; 
    } 
    free_memory(); 
} 

而且我的用户类有本作的VAR和析构:

User::User() { 
    username = ""; 
    password = ""; 
    first_name = ""; 
    last_name = ""; 
    profile_pic_filename = ""; 
    birth_year = 0; 
    birth_month = 0; 
    birth_day = 0; 
} 

User::~User() { 
    //Nothing placed in body because strings and ints are dealt with by OS? 
} 
+0

为什么你的'free'变量在'free_memory'函数中?! – emartel

+2

'currentNode = head;'创建一个内存泄漏。 – andre

回答

4

为现在写的代码只有一个严重的缺陷;您删除链接到head的列表,但从未将头部设置为NULL。任何人从这一点触及它都会通过垃圾指针触发未定义的行为。

如果您像这样清除列表,则将head设置为NULL。另外,因为无论如何你都知道head应该是NULL,所以放弃使用currentNode。只需使用head本身作为行走列表的指针。想一会,它会来找你。

此外,在你的析构函数中不需要检查(head == NULL)。它已经在您的free_memory()函数中检查过,因为它应该是。

+0

对不起,删除那部分,这是测试,看看项目是否被删除 – gndimitro

+0

我没有运行时错误,这是我假设的逻辑错误,因为如果我尝试访问列表后,我运行免费记忆功能,该列表仍然存在,并且所有数据都可定位 – gndimitro

-1

你正在手动释放它,这就是你做错了什么。像聪明人一样使用智能指针,制作一个程序,就像一个想要为他的手艺获得报酬的人一样工作。

+0

我同意使用智能指针,特别是如果OP询问并验证了他使用的是C++ 11兼容工具链。我没有看到提及的用法(或其中的愿望),尽管包含提升智能指针是一件容易的事情,我可以'明白为什么他不会使用它们。 – WhozCraig

+0

他在2011年的某个时间标记了C++ - 即C++ 11。即使'auto_ptr'在这种情况下也能正常工作。 – Puppy

+0

这是?那么C++ 11标签即将被弃用的时机是什么时候? – WhozCraig

相关问题