2013-09-26 66 views
-4
#include <iostream> 

using namespace std; 

int main() 
{ 
char* p=new char[10]; 
p="sudheer"; 
char* q=new char[10]; 
q=p; 
delete []p; 

return 0; 
} 

當我運行上述程序時,它崩潰與刪除。任何意見?應用程序崩潰時刪除調用

+8

專業提示:改爲使用'std :: string'。 – Shoe

+1

關於指針的教程一定會對您有所幫助。看看任何推薦的C++書籍 –

回答

5

是的,你正在刪除一個字符串文字「sudheer」,這足以造成程序崩潰。

我認爲你的錯誤是不理解如何複製C字符串,使用strcpy。此外,如果您使用new [],則必須使用delete[]而不是delete。你可能打算寫這個程序

#include <iostream> 
#include <cstring> 

using namespace std; 

int main() 
{ 
    char* p=new char[10]; 
    strcpy(p,"sudheer"); // use strcpy to copy C strings 
    char* q=new char[10]; 
    q=p; 
    delete[] p; 

    return 0; 
} 
+0

至少有'strcpy(q,p);'以及刪除'q' ... – rabensky

+0

但它沒有與'p =「sudheer」'崩潰。正如我所提到的那樣,它是用'delete [] p;'崩潰的。 –

+0

@ user2820017'p =「sudheer」;'不是錯誤,在執行'p =「sudheer」後刪除'p';'是錯誤。 'p'只是一個指針,它指向內存。當你做'delete [] p;'它必須指向動態分配的內存。當你寫'p =「sudheer」;'你讓'p'指向一個字符串,而不是動態分配內存。 – john

2

的常量"sudheer"被理解爲一個指向8個字節的只讀存儲器區。

您正在刪除它,這是undefined behaviorp=new char[10]的前一個結果是不可訪問的內存區域。你有內存泄漏。

我建議使用std::string如此宣佈

std::string p = "sudheer"; 
2

p是一個指向字符。首先,創建10個字符的內存塊,並告訴p指向那個(p=new char[10];)。下一行你告訴p而不是指向另一個帶有文本「sudheer」的內存塊(p="sudheer";)。

此時p不再指向您分配的內存塊,因此刪除p不會取消分配該塊。它試圖釋放字符串。

確實 - 什麼也沒有指向了10個字符的內存塊了。它丟失在計算機的內存中。這是內存泄漏。

請注意,您正在使用q。如果你想拷貝字符串使用strcpy。或者,很明顯,您可以使用std::string(與#include <string>),然後使用像您期望它們的行爲而不是指針在c中使用的字符串。

0
p="sudheer"; 

然後

delete p; 

你超支動態分配p,然後試圖刪除它,它失敗。