0

因爲我在本科課程的大部分時間裏都被Java錄製了,所以我對C++比較新手(這是一個恥辱)。內存管理一直很麻煩,但我已經購買了許多關於ansi C和C++的書籍。我探討了相關的問題,但找不到符合此特定標準的問題。也許很明顯沒有人提到它?通過指針刪除一個非擁有的動態數組

這個問題一直在困擾着我,但我覺得好像有一個我沒有使用的概念點。

假設:

char original[56]; 
cstr[0] = 'a'; 
cstr[1] = 'b'; 
cstr[2] = 'c'; 
cstr[3] = 'd'; 
cstr[4] = 'e'; 
cstr[5] = '\0'; 
char *shaved = shavecstr(cstr); 
// various operations, calls // 
delete[] shaved; 

其中,

char* shavecstr(char* cstr) 
{ 
    size_t len = strlen(cstr); 
    char* ncstr = new char[len]; 
    strcpy(ncstr,cstr); 
    return ncstr; 
} 

在整個的一點是要有「原始」是一個與字符填充,並定期有其複製剃光和其他地方使用的緩衝。

爲了澄清,通過std::gets(char* buff),std::getline(char* buff, buff_sz),std::read(char* buff, buff_sz)或任何原位填充輸入閱讀器填寫原件。爲了「刮」一個字符串,它基本上被截斷,消除了未使用的數組空間。

錯誤是堆分配錯誤,並且分段在delete[]上。

爲了防止泄漏,我想釋放由'shaved'持有的內存,在它通過一些參數後再次使用。這可能是一個很好的理由,但是應該有一些方法來釋放內存,就像這個配置一樣,沒有辦法訪問數據的原始所有者(指針)。

+0

你的'原始'緩衝區在哪裏被使用? 'cstr'應該是'original'嗎? – mch 2010-04-12 04:04:03

+1

你有什麼問題?是否有編譯器錯誤?除了變量名稱錯誤,以及我不瞭解你想用「剃鬚」完成什麼,完全是什麼問題?如果你認真對待使用C++,你應該使用'std :: string'而不是'char *',並且完全避免整個內存管理混亂。 – mch 2010-04-12 04:06:46

+0

而且cstrn應該是cstr? – 2010-04-12 04:07:05

回答

1

我假設你會替換originalcstr,否則代碼將不編譯爲cstr沒有聲明。

這裏的錯誤是分配數組的大小太小。你想char* ncstr = new char[len+1];帳戶的終止\0

另外,如果你在函數返回後立即刪除shaved,有在調用該函數是沒有意義的......

[*]轉到深一點,用於cstr內存將被釋放時,包含函數返回。通常這樣的靜態字符串被放置在應用程序整個持續時間的常量中。例如,您可以在所有功能之外擁有const char* cstr="abcde";。然後你可以傳遞這個字符串而不必動態分配它。

0

假設你想用cstr而不是cstrn ...

你不應該刪除cstr。您應該刪除shaved

您只有delete分配了new的內存。 delete[]內存分配new[]

shaved只是一個保存內存地址的變量。您將該內存地址傳遞給delete[]以清除內存。 shaved保存已分配new[]的內存的內存地址。