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_ptr
或 boost::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;
}
请注意,nPointer3
和 nPointer4
应该在 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/