gpt4 book ai didi

c++ - 删除多个列表指向的数据?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:55:26 24 4
gpt4 key购买 nike

我有一个可能会出现在多个列表中的对象。

例如

std::list<object*> lista = new std::list<object*>();
std::list<object*> listb = new std::list<object*>();

object* obj = new object();
lista->push_front(obj);
listb->push_front(obj);

可能有许多对象将以相同的方式出现在两个列表中。我意识到智能指针是很容易做到的事情,但称我为受虐狂 - 我更愿意弄清楚如何在没有智能指针的情况下做到这一点。

目前,我正在尝试这种技术:

td::list<object*>::iterator iter;
for(iter = lista->begin(); iter != lista->end(); iter++) {
delete (*iter);
*iter = 0;
}

std::list<object*>::iterator iterB;
for(iterB = listb->begin(); iterB != listb->end(); iterB++) {
if(*iterB != 0) {
delete (*iterB);
*iter = 0;
}
}

delete lista;
delete listb;

但它在运行时打破了我的 delete lista; 等价物。希望有人对指针更聪明可以帮助我。提前致谢!

附言我正在运行 Windows 7/MinGW。

最佳答案

一个主要问题是您(显然,您没有提供完整代码)删除 一个对象两次:一次是在遍历列表 A 时,一次是在遍历列表 B 时。

主要有以下三种解决方案:

  • 使用像 std::shared_ptr 这样的引用计数智能指针。
    推荐的。你不想使用智能指针的声明似乎是出于无知而不是一些愚蠢的经理的要求。

  • 将节点也保留在主列表中:
    删除一个节点只有当你知道它仍然存在的唯一列表是主列表时。

  • 自己实现一个引用计数:
    最简单的方法还是使用现有的库解决方案,例如 boost::intrusive_ptr,但您所要做的就是在每个节点中精心维护一个引用计数。 删除当引用计数下降到 0 时。

第四种可能性是使用垃圾收集器,例如 Boehm 收集器,但代码需要结构化以支持它。或者至少那是我的印象。并且可能很难获得这方面的帮助,因为很少有 C++ 程序员使用这种方法(这表明它并非完全没有问题)。

关于c++ - 删除多个列表指向的数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14078530/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com