2013-03-31 74 views
0

我在我的代碼的對象稱爲「schemeList」,看起來像這樣:c + +通過參數的內存問題遞歸傳遞

class scheme; 
class schemeList 
{ 
    friend class scheme; 
private: 

    scheme * head; 
    schemeList * tail; 

public: 
    schemeList(); 
    Token addScheme(vector <Token> &toAdd); 
    //...other functions 
}; 

我有一個問題,功能爲「addScheme」這是應該向頭部添加方案,或者如果頭部已滿,則將其添加到尾部(在鏈接列表中以某種方式)。這裏是我迄今爲止功能:

Token schemeList::addScheme(vector<Token>& toAdd) 
{ 
    if (head->retCloseParen() != ')') 
    { 
     scheme * headCopy = head;  
     Token answer = head->addScheme(toAdd); 
     head = headCopy; 
     return answer; 
    } 
    else 
    { 
     //deal with tail 
     schemeList * arrow = this; 

     while (arrow->tail != NULL) 
     { 
      arrow = arrow->tail; 
     } 

     tail = new schemeList(); 

     tail->head= new scheme(); 
     tail->tail = NULL; 

     Token answer = arrow->tail->addScheme(toAdd); 
     return answer; 
    } 
} 

也能正常工作,用於將第一方案,但第二個方案拋出一個錯誤,指出「未處理的異常......」。我有一個這樣的問題,但我通過引用變量toAdd而不是傳遞整個對象來修復它。爲什麼這會拋出錯誤和/或我該如何解決它?

如果它使事情變得更加清晰,一個方案是:

class scheme 
{ 
    friend class identifierList; 

public: 
    Token * id; 
    char openParen; 
    char closeParen; 
    identifierList * idList; 

    scheme(); 
    //other functions 
}; 

class identifierList 
{ 
    friend class scheme; 
public: 
    Token * id; 
    identifierList * next; 

    identifierList(Token * inId, identifierList * inNext); 
}; 

和令牌是:

class Token 
{ 
    friend class datalogProgram; 

public: 
    int lineNumber; 
    string type; 
    string value; 

    Token(string inType, string inValue, int inLineNum); 
    //other functions 
}; 
+2

你應該使用'std :: list'或'std :: vector'而不是浪費時間重新創建鏈表。 –

+0

顯示你的'scheme :: addScheme'實現。和你得到例外的調用堆棧。 – Paul

回答

0
  • 沒有足夠的詳細情況進行說明,尤其是這是造成異常的代碼。你最好調查一下這個調用堆棧!
  • 你正在初始化head和其他指針變量NULL - 我沒有看到任何構造函數。也沒有任何支票(它只是head->retCloseParen() != ')'支票)。
  • 正如Thomas在評論中所建議的那樣,您應該更好地使用已經爲您提供的一些容器類。