我正在使用Visual Studio 2013,我想为单链接循环列表创建自己的复制构造函数。 这是构造函数的代码。
CCircularList::CCircularList(CCircularList& srcList) // Copy Constructor
{
Node* sPtr = srcList.top; // source pointer, top points to first entry in the list
Node* dPtr = top = new Node(*sPtr); // dPtr is destination pointer,
sPtr = sPtr->next;
while (sPtr != srcList.top)
{
dPtr->next = new Node(*sPtr);
sPtr = sPtr->next;
dPtr = dPtr->next;
}
setPosition(srcList.getPosition());
dPtr->next = top;
}
这不能正常工作。使用复制构造函数初始化列表后,当我尝试显示它时出现此错误。
循环List.exe中0x011F3C99处的未处理异常:0xC0000005:访问冲突读取位置0x00000000。
这是Node类的复制构造函数。
Node::Node(Node& newNode) // Copy constructor
{
nData = newNode.nData; // Visual studio points to this line when giving error
next = newNode.next;
}
提前致谢。
答案 0 :(得分:0)
代码不完整。你必须首先确保CCircularList& srcList是正确构造的。此外,由于您复制了引用节点数据和下一个地址,因此节点构造函数似乎有些错误。我认为更正确可能有些像
Node::Node(const Node& oldNode)
: nData(oldNode.nData)
, next(nullptr)
{;}
Indeeed,该错误表明您传递的某些sPtr为null。你可以查看断言做
CCircularList::CCircularList(CCircularList& srcList) // Copy Constructor
{
Node* sPtr = srcList.top; // source pointer, top points to first entry in the list
assert(sPtr);
Node* dPtr = top = new Node(*sPtr); // dPtr is destination pointer,
sPtr = sPtr->next;
while (sPtr != srcList.top)
{
assert(sPtr);
dPtr->next = new Node(*sPtr);
sPtr = sPtr->next;
dPtr = dPtr->next;
}
setPosition(srcList.getPosition());
dPtr->next = top;
}