2011-03-27 25 views
0

一旦創建了新的MyString對象,我的程序就會崩潰。未處理的異常錯誤,內存衝突

當在構造函數中將stringArray [0]設置爲空字符時,會出現內存訪問衝突。有任何想法嗎?

這裏是構造

MyString::MyString() 
{ 
    stringSize = 0; 
    stringCap = 16; 
    stringArray[stringCap + 1]; 
    stringArray[0] = '\0'; 
} 

這裏是類私有成員

char* stringArray; 
int stringCap; 
int stringSize; 

下面是該對象在main.cpp中創建

MyString s1; 

回答

1

這行做不分配內存:

stringArray[stringCap + 1]; 

你需要替換它:

stringArray = new char[stringCap + 1]; 

不要忘記刪除記憶。

此處的規則也適用於此處,因爲您擁有對象擁有的RAW內存。

另外,如果你不想要動態分配,而是固定大小的字符串。然後你就可以改變你的會員的聲明:

char stringArray[ <FixedSizeHere> ]; 
+0

確實。爲了增加Martin的說法,類的析構函數是你應該釋放分配內存的地方:'MyString ::〜MyString(){delete stringArray; }' – karlphillip 2011-03-27 19:02:59

+0

非常棒的幫助,非常感謝 – bluetickk 2011-03-27 19:04:35

+0

@bluetickk對於我們所有人來說,重溫答案並接受解決問題的答案非常重要,好嗎? – karlphillip 2011-03-27 19:10:34

0
char* stringArray; 

上述聲明說,stringArray是一個指向字符(S)。所以,它應該保存一個角色位置的地址。

stringArray[stringCap + 1]; 

在這裏,您試圖訪問位於在指數stringCap+1彷彿stringArray指向字符數組的字符。但stringArray不包含任何角色的地址位置。因此,內存訪問衝突的錯誤。

如果你打算創建一個大小爲stringCap+1的數組,它也是錯誤的。

stringArray[stringCap + 1]; 
      //^^^^^^^^^^^^^ size of the array should be compile time constant. 
      // i.e., integer literal, or a #defined constant or const int 

看來,程序正試圖創建一個大小的字符數組。所以,你可以在類聲明中做到這一點 -

class MyString 
{ 
    stringArray[17] ; 
    // ..... 
}; 
相關問題