【发布时间】:2014-04-17 13:40:06
【问题描述】:
我正在尝试在 C++ 中的双向链表中使用空对象模式,但我似乎找不到在保持代码干净的同时使用它的方法。
问题出在下面这段代码:
node->getNext()->setPrevious(node->getPrevious());
node->getPrevious()->setNext(node->getNext());
如果下一个/上一个节点是nullptr,getNext 和getPrevious 将返回一个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