【发布时间】:2015-03-21 17:01:02
【问题描述】:
我正在学习智能指针,学习它比在堆上实现一个简单的结构(如链表)更好。
我创建了一个链表结构如下...
// linked list node definition
#ifndef __LINKED_LIST_NODE_H
#define __LINKED_LIST_NODE_H
class LinkedListNode {
friend class LinkedList;
public:
int m_value;
LinkedListNode * m_pNext;
public:
LinkedListNode();
LinkedListNode(int);
LinkedListNode(const LinkedListNode &);
~LinkedListNode();
};
#endif
// linked list definition
#ifndef __LINKED_LIST_H
#define __LINKED_LIST_H
class LinkedList {
LinkedListNode * m_pHead;
LinkedListNode * m_pTail;
public:
LinkedList();
LinkedList(int);
LinkedList(const LinkedList &);
~LinkedList();
void PrintList() const;
void AddItem(int);
void RemoveItem(int);
LinkedListNode * FindNode(int) const;
LinkedListNode * FindMin() const;
LinkedListNode * FindMax() const;
};
#endif
这里是 LinkedListNode 和 LinkedList 类的必要方法(构造函数和析构函数),看看它的样子(IIRC 这些应该是正确的)...
// list node
LinkedListNode::LinkedListNode()
{
m_value = 0;
m_pNext = nullptr;
}
LinkedListNode::LinkedListNode(int value)
{
m_value = value;
m_pNext = nullptr;
}
LinkedListNode::LinkedListNode(const LinkedListNode & copyNode)
{
m_value = copyNode.m_value;
m_pNext = copyNode.m_pNext;
}
LinkedListNode::~LinkedListNode()
{
// not needed, no dynamic allocation
}
// linked list
LinkedList::LinkedList()
{
m_pHead = nullptr;
m_pTail = m_pHead;
}
LinkedList::LinkedList(int value)
{
std::shared_ptr<LinkedListNode>newNode{ new LinkedListNode(value) };
m_pHead = newNode.get();
m_pHead->m_pNext = nullptr;
m_pTail = m_pHead;
}
LinkedList::LinkedList(const LinkedList & copyList)
{
if (copyList.m_pHead == nullptr)
{
m_pHead = nullptr;
m_pTail = m_pHead;
}
else
{
std::shared_ptr<LinkedListNode>NodeResource{ new LinkedListNode(*copyList.m_pHead) };
LinkedListNode * tempNode = NodeResource.get();
m_pHead = tempNode;
while (tempNode->m_pNext != nullptr)
{
std::shared_ptr<LinkedListNode>NodeResourceNext{ new LinkedListNode(*tempNode->m_pNext) };
tempNode->m_pNext = NodeResourceNext.get();
tempNode = NodeResourceNext.get();
}
m_pTail = tempNode;
}
}
LinkedList::~LinkedList()
{
// not needed, allocating using smart pointers
}
现在,LinkedList 类包含 AddItem 方法,其主体是这样的:
void LinkedList::AddItem(int value)
{
std::shared_ptr<LinkedListNode>newNode{ new LinkedListNode(value) };
if (m_pHead == nullptr) // linked list is empty
{
m_pHead = newNode.get();
m_pTail = newNode.get();
}
else
{
m_pTail->m_pNext = newNode.get();
m_pTail = newNode.get();
}
}
我不知道为什么,但是当我尝试将一个项目添加到我的链表时,当你超出该方法的范围时,似乎 newNode 变量被删除了。
这是我尝试调试程序时的样子...
首先我们从空链表开始
然后在 AddItem 函数中,我得到以下结果(看起来 m_pHead 和 m_pTail 正确地指向堆上新创建的 newNode。
但是当 AddItem() 方法超出范围时,这就是我剩下的
我想,一旦没有引用指针,std::share_ptr 就会被删除。在我的例子中,newNode 被两个指针 m_pHead 和 m_pTail 引用。离开 AddItem() 方法时它真的被删除了,还是我的代码中存在我没有发现的缺陷?
非常感谢你们的意见,伙计们。
【问题讨论】:
-
当引用它的最后一个共享 ptr 被删除时,共享 ptr 将被释放。它不知道您还使用常规指针指向它。
-
您可能会认为这些屏幕截图有帮助,但实际上却很伤人:它清楚地表明您在问题上付出了一些努力,但这让我们很难回答,因为我们无法复制任何内容并且必须重新输入所有内容。
-
@ereOn 很抱歉给您带来不便,我对这个网站不是很有经验。
-
@Andy:不用担心。 SO的好处是您可以随时更新/修复您的问题/答案以造福所有人:)
标签: c++ c++11 shared-ptr smart-pointers singly-linked-list