2011-09-12 80 views
2

的陣列我在用於在其被使用的類,稱爲CommentManager的頭部聲明動態分配一類

private: 
    Comment *commentArray; 
    int arrSize; 

。這些在建築工初始化,如下:

arrSize = 1; 
commentArray = new Comment[arrSize]; 

如果我正確理解這一點,這應該創建一個註釋的「陣列」。然後我設置了這個類的核心功能:

void CommentManager::addComment(QString commText, int start, int end) 
{ 
    Comment *saveArray; 

    saveArray = new Comment[arrSize + 1]; 

    for (int i = 0; i < arrSize; i++) 
     saveArray[i] = commentArray[i]; 

    delete[] commentArray; 

    commentArray = saveArray; 

    arrSize += 1; 

這應該放大commentArray的大小一個。然後,我要添加註釋的數據,這是通過在評論中聲明的函數來完成:

頁眉:

private: 
    QString comment; 
    int startPosition; 
    int endPosition; 

功能:

void Comment::setComment(QString comm,int newStartPos, int newEndPos) 
{ 
    comment = comm; 
    startPosition = newStartPos; 
    endPosition = newEndPos; 
} 

我調用這個函數如下:

commentArray[arrSize].setComment(commText,start,end); 

這會導致段錯誤:根據調試器的「註釋」不存在。因此,我試圖在commentArray中初始化單個註釋,但是編譯器不會編譯它。我不確定這裏出了什麼問題,任何幫助都會很感激。

+6

是在頭一個'類{}包裹那些東西;'?另外,爲什麼你不使用'std :: vector'? – birryree

+0

..或QVector? – stijn

+0

你知道什麼是「三個規則」嗎?如果不是這樣做,你會錯誤的。使用已知道如何進行內存管理的對象(std:vector或QVector)。代碼更好時也不要使用英文。在上面描述了構造函數中的內容(但不顯示構造函數?????????只需顯示構造函數就可以更加精確,我們可以看到在定義它的過程中是否犯了錯誤。你有沒有定義(爲什麼不只是把課程壓低?) –

回答

4
commentArray[arrSize].setComment(commText,start,end); 

arrsize太過分了。

一個數組的大小爲10的索引從0到9,使用10將超出限制。

3
commentArray[arrSize].setComment(commText,start,end); 

總是會引用不存在的元素,因爲您指向的元素超過了數組中的元素數。該聲明應該是

commentArray[arrSize-1].setComment(commText,start,end); 

另外,代替人工管理對象的數組,你應該使用一個容器類。如果你可以使用提升,請看看boost::ptr_vector。如果沒有,請考慮使用以下之一:

std::vector<std::unique_ptr<Comment> > commentArray; 

std::vector<std::shared_ptr<Comment> > commentArray;