复制构造函数后链表中的访问冲突
Access Violation in Linked-List after copy constructor
我在C++中创建了一个链接列表,但在列表中插入新项目时遇到访问冲突。
如果从不调用复制构造函数,并且在整个程序执行过程中使用原始列表,则该列表可以完美运行。
在按值调用函数"outList"创建列表的副本以在其范围内进行管理后,我在插入方法中收到错误。
该列表维护一个游标(指针),指向作为活动元素的 ListElement。 该列表包含诸如"gotoNext"和"gotoPrior"等方法。 复制构造函数的目标是创建列表的深层副本,并保持游标在副本中的位置。
在读取代码之前,这里是堆栈跟踪,如您所见,程序仅在将一个元素添加到列表中后崩溃。
LinkedListExample.exe!LinkedList<char>::insert(const char & item, int position) Line 71 C++
LinkedListExample.exe!LinkedList<char>::LinkedList<char>(const LinkedList<char> & src) Line 35 C++
LinkedListExample.exe!main() Line 62 C++
这是主()
void main()
{
LinkedList<char> testList; // Test list
char insertChar;
do{
cin >> insertChar;
outList(testList);
testList.insert(insertChar, 0); //0 means insert after cursor, -1 insert before.
}
while(insertChar != 'q')
}
这是外表列表
template <typename Type>
void outList(LinkedList<Type> list)
{
char tmp;
if (list.empty())
cout << "Empty list" << endl;
else
{
list.gotoBeginning();
do
{
tmp = list.retrieve();
cout << tmp << " -> ";
}
while (list.gotoNext());
cout << endl;
}
}
下面是 LinkedList 复制构造函数:
template <typename Type>
LinkedList<Type>::LinkedList(const LinkedList &src){
if(src.head == NULL){
head = NULL;
cursor = NULL;
}else{
ListElement *iterator = src.head;
ListElement *placeHolder = src.cursor;
int numHops = 0;
if(iterator->next == NULL){
numHops = 1;
}else{
while(iterator != placeHolder){
numHops++;
placeHolder = placeHolder->next;
}
}
iterator = src.head;
while(iterator != NULL){
insert(iterator->element, 0);
if(iterator->next != NULL){
iterator = iterator->next;
}else{
break;
}
}
gotoBeginning();
if(numHops != 0){
for(int i = 0; i < numHops; i++){
gotoNext();
}
}
}
}
这是链接列表插入:
template <typename Type>
void LinkedList<Type>::insert(const Type &item, int position){
if(head == NULL){
ListElement *newElement = new ListElement(item, NULL);
newElement->next = NULL;
head = newElement;
cursor = head;
}else if(position == 0){
if(head->next == NULL){
cursor = head;
}
//Create a new ListElement after the current.
ListElement *newElement = new ListElement(item, NULL);
//Preserve link (if there is one)
if(cursor->next != NULL){
newElement->next = cursor->next;
}
cursor->next = newElement;
cursor = newElement;
}else if(position == -1){
//Add a new element before the current.
ListElement *newElement = new ListElement(item, NULL);
if(head->next == NULL || (cursor == head && cursor != NULL)){
//Special case. There is only one node. Must update head pointer.
newElement->next = head;
head = newElement;
cursor = newElement;
}else{
//Node will be put between two other nodes.
ListElement *iterator = head;
while(iterator->next != cursor){
iterator = iterator->next;
}
newElement->next = iterator->next;
iterator->next = newElement;
cursor = newElement;
}
}//end if line 24
}
供您参考,堆栈跟踪告诉我第 71 行是崩溃点。这是代码块"插入"中的那行...
else if(position == 0){
if(head->next == NULL){
cursor = head;
}
//Create a new ListElement after the current.
ListElement *newElement = new ListElement(item, NULL);
//Preserve link (if there is one)
if(cursor->next != NULL){ //LINE 71 LINE 71 LINE 71 LINE 71
newElement->next = cursor->next;
}
在复制构造函数中,如果src.head != null
,则在首次调用 insert 时不会初始化head
和cursor
。您可能打算将它们初始化为NULL
.
尝试使用此代码代替第 71 行
else if(position==0){
ListElement *newElement = new ListElement(item,NULL);
if(head->next==NULL){
cursor = head;
}
else{
while (cursor->next!=NULL) { //placing the cursor on the last node inserted.
cursor = cursor->next;
}
newElement->next = cursor->next;
cursor->next = newElement;
cursor = newElement;
}
}
相关文章:
- 链表中写入访问冲突的未知原因
- 为什么我在空指针错误(链表)中获取成员访问权限
- 在C++中删除双向链表的头节点后出现访问冲突异常
- 循环访问自定义双链表
- 如何通过不同的指针使用类的对象访问结构?(链表)(C++)
- 尝试从单向链表C++中删除单个节点时出现读取访问冲突
- 链表的访问冲突异常
- C++链表读取访问冲突
- 我如何能够访问双向链表中的嵌套结构
- c++ 访问单个链表中的特定值
- 存储类对象的C++模板链表-未处理的异常访问冲突读取位置
- 在C++中读取链表上的访问冲突
- 链表访问冲突写入位置
- 链表访问冲突
- 写入位置c++链表时发生访问冲突
- 打印链表-访问冲突c++
- 如何使用boost::iterator_facade来访问遗留链表
- c++哈希表和链表的访问冲突
- 如何访问C++链表中的对象数据
- 复制构造函数后链表中的访问冲突