2015-01-16 41 views
0

我是C++新手......我正在玩指針...... 此代碼使用char ptr作爲數組。C++指針製作數組

#‎include‬<iostream> 
using namespace std; 

int main(){ 

    cout << "Playground "<<endl; 

    const short max=10; 

    char * str=new char ; 

    for (short i=0;i<max;i++) 
     *(str+i)=char(i+100); 

    for (short i=0;i<max;i++) 
     cout <<str+i<< char(3) <<endl; 

    for(short i=0;i<max;i++) 
     delete (str+i); 

    return 0; 
} 

但我不知道,如果刪除(STR + I)工作或沒有,爲什麼? 但我認爲這是行不通的,因爲我已經運行的程序很多次,雖然串印:

Playground 
defghijklm 
efghijklm 
fghijklm 
ghijklm 
hijklm 
ijklm 
jklm 
klm 
lm 
m 

我有這樣的錯誤消息

try #0 
*** Error in `./p': free(): invalid pointer: 0x09d90009 *** 
Aborted (core dumped) 

try #1 
*** Error in `./p': free(): invalid pointer: 0x08453009 *** 
Aborted (core dumped) 

try #2 
*** Error in `./p': free(): invalid pointer: 0x0863c009 *** 
Aborted (core dumped) 

etc ... 

由於無效的指針不斷變化,我有感覺,物體沒有被刪除或垃圾收集,每次我運行的代碼我使用另一個區域的內存...

最後,我開始得到爲什麼常規數組更好...

*從一開始就在一個連續的內存空間保留給

*並不需要擔心刪除數據

...

這些只是我的猜測......

+0

'delete(str)'將釋放在原始地址分配的內存。添加'i'會導致指針無效。 –

+0

你可能想看看'str'的​​'string'有多大。 '新char'究竟放在那裏?它是一個足夠大的字符串?如果是這樣,編譯器如何知道它有多大?也許它只在那裏放置一個'char',在這種情況下,其餘的字符去哪裏? –

回答

3

你有越界訪問:

char* str = new char; // single element 

應該

char* str=new char[max]; // array of char 

,你必須釋放內存

delete [] str; 

但要避免手工管理內存,你可以使用std::stringstd::vector<char>

1

你只能做一個動態內存分配,並且只有1字符,但是你在最後的for循環中多次刪除動態分配的內存 - 你只能對每個新的內容刪除一次。

此外,在第一個for循環中,您將新的char值分配給您分配的內存之外,這意味着您正在覆蓋不屬於您的內存。