2013-02-23 387 views
0

要問儘可能簡單地任何人都可以解釋爲什麼這代碼:1 [主] 972異常:手柄:異常:STATUS_ACCESS_VIOLATION的解釋,以及如何解決

LinkedListByGrade::LinkedListByGrade(vector<Node> myNodes) { 
int lowestGradeFound = myNodes[0].getGrade(); 
Node *pFristNode = new Node(); 
cout << "New node created" << endl; 
for (size_t i = 0; i <= myNodes.size(); i++) { 
    if (myNodes[i].getGrade() < lowestGradeFound) { 

     cout << "if triggered" << endl; 
     lowestGradeFound = myNodes[i].getGrade(); 
     pFristNode->reassasignNode(myNodes[i].getFristName(), 
       myNodes[i].getLastName(), myNodes[i].getId(), 
       myNodes[i].getGrade()); 
     cout << "int reassassigned" << endl; 
    } 

是給我這個錯誤:

1 [main] Project 972 exception::handle: Exception: STATUS_ACCESS_VIOLATION 
2130 [main] Project 972 open_stackdumpfile: Dumping stack trace to Project.exe.stackdump 

和想法就如何解決呢?

(對不起,我留在診斷打印語句)

而且這是影響myNodes唯一代碼:

vector<Node> Students; 
Node node1("Bobby", "zilch",28,55); 
Node node2("Evil", "Dentist",308,55); 
Node node3("Raz", "Buton",10,55); 
Students.push_back(node1); 
Students.push_back(node2); 
Students.push_back(node3); 

cout<<"stuff"<<endl; 
LinkedListByGrade myList = LinkedListByGrade(Students); 
+1

是'myNodes.size()== 0'時'INT lowestGradeFound = myNodes [0] .getGrade();'被調用?你將不得不在調試器中運行它。 StackOverflow無法爲你做到這一點! – Johnsyweb 2013-02-23 02:41:36

+1

您需要學習使用調試器。這段代碼執行時,我們無法知道'myNodes'包含了什麼;你是唯一可以確定這個問題的人,並且通過代碼來找出問題。 – 2013-02-23 02:43:44

+0

好吧,但根據你說的這應該是關係到矢量的事情? – Noob 2013-02-23 02:49:17

回答

1

我不能說這是肯定的,但你所訪問沒有分配給你的內存,所以很可能你正在運行在myNodes的邊界。 將能夠使用調試器以確定此

我可以肯定的是,在你的函數的第一行調用:

int lowestGradeFound = myNodes[0].getGrade(); 

如果在myNodes沒有項目,那麼這應該會導致訪問衝突。

因爲您正在訪問myNodes[myNodes.size()],所以您肯定會在for -loop中運行myNodes的結尾。

嘗試是這樣的:

LinkedListByGrade::LinkedListByGrade(vector<Node> const& myNodes) { 
    // Pass by const-reference! ------------------^ 

    // Set this to something high. Don't access the vector, in case there are no 
    // elements therein: 
    int lowestGradeFound = std::numeric_limits<int>::max(); 

    // Where is this deleted? 
    Node *pFirstNode = new Node(); 

    // Use iterators, not indices for looping over a container... 
    for (vector<Node>::iterator i = myNodes.begin(), end = myNodes.end(); != end; ++i) 
    { 
     // Access element by `i->` 
     if (i->getGrade() < lowestGradeFound) 
     { 
      // Now you can assign this safely... 
      lowestGradeFound = i->getGrade(); 
      pFirstNode->reassasignNode(
       i->getFirstName(), 
       i->getLastName(), 
       i->getId(), 
       i->getGrade()); 
     } 
    } 

    // [...] 
} 

但你真的,真的需要學習使用調試器!

+0

我沒有使用調試器的原因是因爲它給了我一個錯誤。我已經做了很多研究,但是我需要更多的調試器來處理我的代碼。以下是錯誤,如果你有這方面的答案'無法找到「/usr/lib/gcc/i686-pc-cygwin/3.4.4/include/c++/iostream」源文件 找到文件或編輯源查找路徑包含其位置。「# – Noob 2013-02-23 03:18:57

+0

您不需要'iostream'來調試此功能! – Johnsyweb 2013-02-23 03:27:58