提问人:TheN00bBuilder 提问时间:10/11/2020 最后编辑:JaMiTTheN00bBuilder 更新时间:10/11/2020 访问量:594
C++ - std::list.erase() 不删除元素
C++ - std::list.erase() not removing element
问:
我在学校作业的一些代码上遇到了一个小问题(我知道这里被回避了,但我把自己锁在了使用图书馆上,并为此付费)。我有一个函数,它有一个指向传递给它的类的指针列表,以及一个属于我想要销毁和调整列表大小的类之一的特定 ID。但是,使用我的代码,列表永远不会调整大小,并且值是垃圾,这会使我的程序崩溃。因此,看起来实际的类正在被删除,但该元素从未从列表中删除......std::list
如果我有时间制作自己的双向链表实现,我会遍历列表,寻找要删除的元素。如果找到它,请创建一个临时节点指针,并将其指向我将要删除的节点。将上一个节点的“next”元素设置为迭代器的“next”元素,然后删除迭代器节点。
但。。使用实现,我不知所措。这是我到目前为止所拥有的,其中 DOCO 是一个类,列表中的元素是指向类实例的指针。我已经研究了 vs. ,也许两者都使用可能会解决它,但我不确定如何使用这样的迭代器实现。stl::list
remove()
erase()
remove()
bool DOCO::kill_doco(std::list < DOCO* > docolist, int docoid)
{
for (std::list<DOCO*>::iterator it = docolist.begin(); it != docolist.end(); )
{
if ((*it)->id == docoid)
{
delete * it;
it = docolist.erase(it);
std::cerr << "item erased\n";
}
else
{
++it;
}
}
std::cerr << "leaving kill\n";
return true;
}
答:
kill_doco(std::list < DOCO* > docolist
这将创建列表的副本。此副本是指针列表。
继续修改列表的副本,并删除其中的元素。
原始列表(您复制的)仍具有原始指针,该指针现在指向已删除的对象。
简单的解决方法是:
kill_doco(std::list < DOCO* >& docolist
C++是一种面向价值的语言,与Java或C#等语言不同。某物的名称是指该事物的实际值,而不是对它的引用。
指针同样是对象地址的值。
类似语义的引用,或类似指针的语义,可以在C++中完成。但是,与 Java/C# 不同的是,默认情况下,C++ 中的每个对象都是一个实际值。
从一种语言转移到另一种语言(无论哪种方式)的人都会对此感到困惑。
C++ 程序中的“默认”对象类型是常规类型——当你复制它时,它就像一个整数,等等。摆脱这一点相对容易,但这是默认设置。
所以你所做的类似于:
void clear_bit( int x, int bit ) {
x = x & ~(1 << bit);
}
并且惊讶于您传入的值没有被函数修改。原始列表中留下的“悬空”指针是咬你的第二件事。x
评论
std::unique_pointer
new
delete
std::shared_ptr
std::unique_ptr
new
delete
new
delete
上一个:具有快速查找功能的 C++ 列表
下一个:deque 和列表之间的差异行为
评论
bool DOCO::kill_doco(std::list < DOCO* >& docolist, int docoid)