C++ 我不知道';我不明白我的意思;我的内存分配不当

C++ 我不知道';我不明白我的意思;我的内存分配不当,c++,list,memory,linked-list,delete-operator,C++,List,Memory,Linked List,Delete Operator,因此,我有一个正确创建的链接列表,链接正确,但当我试图取消分配内存时,我似乎无法删除任何节点,该列表仍然存在。 我的列表解构器的代码: void LL_User::free_memory() { // TODO LL_User_Node *currentNode; currentNode = head; while(currentNode) { LL_User_Node *temp = currentNode; currentNod

因此,我有一个正确创建的链接列表,链接正确,但当我试图取消分配内存时,我似乎无法删除任何节点,该列表仍然存在。 我的列表解构器的代码:

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();
}
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?
}

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

如果像这样擦除列表,请将head设置为NULL。或者,由于您知道在完成此操作后,
head
应该是
NULL
,因此请完全放弃使用
currentNode
。只需使用
head
本身作为遍历列表的指针。想一想,你就会明白的


此外,如前所述,析构函数中不需要检查(
head==NULL
)。它已经在您的
free_memory()
函数中进行了检查,这是应该的。

您正在手动解除分配它,这就是您所做的错误。像智者一样使用智能指针,让一个程序像一个想为自己的技艺获得报酬的人一样工作。

为什么要在
空闲内存中添加
新的
变量<代码>当前节点=头部创建内存泄漏。抱歉,删除了该部分,用于测试项目是否被删除。如果没有运行时错误,我假设这是一个逻辑错误,因为如果我在运行空闲内存函数后尝试访问列表,列表仍然存在,并且所有数据都位于智能指针上,特别是当OP被询问并验证时,他使用的是符合C++11标准的工具链。我看不到boost的用法(或其中的愿望),尽管包含boost智能指针是如此简单,我看不出他为什么不使用它们。他标记了C++,从2011年的某个时候起就是C++11。在这种情况下,即使是
auto_ptr
也可以正常工作。是吗?那么什么时候C++11标记即将被弃用?不,我的意思是我没有看到它的公告。在宣布之后的几个月里(甚至现在),我一直在关注
家庭作业
标签被弃用并停止使用。我没有看到任何关于C++ 11的声明,事实上,这是我第一次听到这样的事情。虽然智能指针是一个更好的解决方案,然后是手动内存管理,这显然是一个技术练习,否则OP应该只使用标准库中的链表。因此,您没有向OP解释相关代码的实际错误,也没有提供任何一致的改进方法。你所做的事情就像走进索姆河并宣称“不要被枪杀”,虽然这是合理的建议,但它是痛苦而明显的,也是完全无用的。