【问题标题】:Null Object Pattern in a doubly linked list双向链表中的空对象模式
【发布时间】:2014-04-17 13:40:06
【问题描述】:

我正在尝试在 C++ 中的双向链表中使用空对象模式,但我似乎找不到在保持代码干净的同时使用它的方法。

问题出在下面这段代码:

node->getNext()->setPrevious(node->getPrevious());
node->getPrevious()->setNext(node->getNext());

如果下一个/上一个节点是nullptrgetNextgetPrevious 将返回一个NullNode 对象。

失败的用例 - 当节点是头节点时:

以下将设置第二个节点的前一个指针指向一个 NullNode 对象导致内存泄漏。

node->getNext()->setPrevious(node->getPrevious());

我在这里想要完成的是保持 NOP 并保持代码干净,不受 nullptr 和类类型比较的影响,

任何建议将不胜感激!

【问题讨论】:

  • 简单的if 支票?例如。 if (node != nullptr) { ... }?
  • 我不明白这个问题。如果 node->prev 是 NullObject,您是否不希望 node->next->prev 设置为 NullObject?
  • 如果我理解你的话,这是一个内存管理问题,而不是一个空对象实现问题。 (例如,如果您使用 smart pointers,您会看到预期的行为并且没有内存泄漏。)事实上,如果您根本不使用 NOP,您会遇到完全相同的内存泄漏。
  • @Lilshieste 智能指针不适用于双链表,因为涉及到循环。
  • @JamesKanze 好点;完全忽略了那个。

标签: c++ c++11 linked-list doubly-linked-list null-object-pattern


【解决方案1】:

如果你存储前一个和下一个节点,事情会更简单,就像这样:

Node* Detach( Node* node) {
  auto prev = node->getPrevious();
  auto next = node->getNext();
  prev->setNext( next );
  next->setPrevious( prev);

  node->setNext( nullNodeAddr);
  node->setPrevious( nullNodeAddr);

  return node;
}

NOP 或 Sentinel 模式是一种简化操作的方法,它从不关心列表头部和尾部的空值。如果你需要在某个地方测试它,那么你就失败了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-12
    相关资源
    最近更新 更多