c++ - 删除动态链表有困难吗?

标签 c++ dynamic-arrays

  struct Package_Node
    {
        int bar_code;
        float package_weight;
        Package_Node *next_packaged;
    };

    struct Key_Node
    {
        int key;
        Package_Node *next_package;
    };        

   for(int i=0; i<3; i++)
            {
                if(keyMain[i].next_package==NULL)
                {
                    continue;
                }

                if(keyMain[i].next_package!=NULL)
                {
                    nPointer3=keyMain[i].next_package;
                    nPointer4=keyMain[i].next_package;
                    while(nPointer3)
                    {
                        nPointer4=nPointer4->next_packaged;
                        delete[] nPointer3;
                        nPointer3=nPointer4;
                    }
                }
            }

keyMain 一个由给定结构 key_node 描述的数组。

Key main 本身是一个动态数组,但为了代码的缘故,我将其显示为一个静态数组。

假设数组有 3 个索引长,0,1,2,每个索引包含一个单独的链表。现在我试图删除每个链接列表,但似乎有些正在被删除,有些则没有。

如何解决这个问题?

最佳答案

你做错了什么?其一,您正在手动管理内存。

#include <memory>

struct Package_Node
{
  int bar_code;
  float package_weight;
  std::unique_ptr<Package_Node> next_packaged;
};

struct Key_Node
{
  int key;
  std::unique_ptr<Package_Node> next_package;
};

要将指针存储在 unique_ptr 中,请使用 reset(new Package_Node())。调用 reset() 而不是 delete。当 unique_ptr 被删除时,unique_ptr 指向的任何内容都会自动删除。

这是 C++11——在 C++03 中,您可能有 std::tr1::unique_ptrboost::unique_ptr,但没有移动语义 unique_ptr 使用起来更危险。


现在,如果您执行上述操作,您的代码将变得更短,并且释放整个链表只是 .reset() 指向第一个节点的智能指针的问题:其他一切都是自动删除!

但是,您可能不愿意这样做。因此,我将解决您代码中的其他一些问题。

您的变量名称不反射(reflect)值的用法。 nPointer4 是一个糟糕的变量名。尝试记录其用途的 PointerToDelete。此外,您应该在初始化时声明指针,并在它无效时将其清除,而不是在使用之前或之后让它一直悬而未决。 (您不会因重用变量而获得奖励积分)。

看看这个循环:

            nPointer3=keyMain[i].next_package;
            nPointer4=keyMain[i].next_package;
            while(nPointer3)
            {
                nPointer4=nPointer4->next_packaged;
                delete[] nPointer3;
                nPointer3=nPointer4;
            }

请注意,nPointer3nPointer4 应该在 while 开始时保存相同的数据,那么为什么它们都存在呢?你可以通过这样重写来减半你的状态:

            Package_Node* ptrToDelete=keyMain[i].next_package;
            while(ptrToDelete)
            {
                Package_Node* nextPtr = ptrToDelete->next_packaged;
                delete ptrToDelete;
                ptrToDelete = nextPtr;
            }

请注意 ptrToDelete 仅在初始化时存在。

请注意 nextPtr 如何尽可能短地存在,然后超出范围。它也只有在初始化后才存在。

接下来,始终始终发布实际演示您的问题的编译代码。您上面的代码由于与您的问题完全无关的原因而无法编译,并且阅读您的想法不是您应该要求人们做的事情。

你不知道什么是错的,那么你怎么知道什么是重要的或不重要的呢?简单:让你的编译器弄明白。生成一个简单的示例来演示您遇到的问题,编译它,测试问题是否仍然存在,然后发布那个

与其提出问题,不如删除部分内容使其更短,发布可能仍然存在或可能不存在问题的非编译代码,并希望其他人能够读懂您的想法。

您完全没有必要使用 struct Package_Node*——Package_Node* 更短并且(除了一些极端的极端情况)做完全相同的事情。

即使您不使用智能指针,拥有指针的 struct 也应该在其析构函数中销毁它,如果它不拥有指针,则其他东西应该销毁它。 RAII是你的 friend 。别忘了关注rule of three当你创建一个拥有指针的 struct 时。

关于c++ - 删除动态链表有困难吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15480466/

相关文章:

c++ - CMake 对 main 的 undefined reference

c++ - 如果静态成员未初始化并且成员类型是类本身怎么办?

c++ - gcc undefined reference 即使 ld 找到库并且它包含所需的函数

c - 动态数组类不会打印

c - 创建动态通用数组时,realloc 出现段错误

c++ - 在 C++ 中删除二维动态数组时出现问题(最终存储在 vector 中)

c++ - 如何在 C++ 中使用条件初始化对象正确获取资源?

c++ - 允许从 std::map 的键中窃取资源吗?

vba - 在 VBA 中追加动态数组

excel - 在 Excel 中检查/检测动态数组溢出