复制构造函数后在Linked-List中访问冲突

时间:2015-06-10 04:17:53

标签: c++ list

我在C ++中创建了一个Linked-List,当我将新项目插入列表时,我遇到了访问冲突。

如果永远不会调用copy-constructor并且在整个程序执行过程中使用原始列表,那么列表就可以正常工作。

在调用值函数'outList'创建列表的副本以便在其范围内进行管理之后,我在insert方法中收到错误。

该列表维护一个指向作为活动元素的ListElement的游标(指针)。该列表包含诸如'gotoNext'和'gotoPrior'等方法。复制构造函数的目的是创建列表的深层副本并保持光标在副本中的位置。

在阅读代码之前,这里是堆栈跟踪,正如您所看到的,程序在仅向列表中添加一个元素后崩溃。

google.maps.event.addListener(map, 'maptypeid_changed', function(event){
if( map.getMapTypeId() === google.maps.MapTypeId.TERRAIN ){
    map.setOptions({maxZoom:/*For example*/5});
}else 
if( map.getMapTypeId() === google.maps.MapTypeId.ROADMAP ){
    map.setOptions({maxZoom:/*For example*/8});
}//Etc...
else{
    map.setOptions({maxZoom:/*For example*/21});
}
});

这是Main()

$("#yourGridId").empty(); // Empty the grid.
$("#yourGridId").data('kendoGrid').refresh(); // Refrsh the grid.

这是Outlist

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++

这是LinkedList复制构造函数:

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')
}

这是LinkedList insert:

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;
    }
}

作为参考,堆栈跟踪告诉我第71行是崩溃点。这是代码块'insert'...

中的那一行
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();
            }
        }
    }
}

2 个答案:

答案 0 :(得分:2)

在您的复制构造函数中,如果src.head != null,则在您第一次调用insert时未初始化headcursor。您可能打算将它们初始化为NULL

答案 1 :(得分:0)

尝试使用此代码代替第71行

ewma.cov <- function(v1,v2,lambda) {
     n <- length(v1)
     cv <- double()
     cv[1] <- 0
     for(i in 1:n)
         cv[i+1] <- cv[i]*lambda + (1-lambda)*v1[i]*v2[i]
     cv
}