因爲我在本科課程的大部分時間裏都被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'持有的內存,在它通過一些參數後再次使用。這可能是一個很好的理由,但是應該有一些方法來釋放內存,就像這個配置一樣,沒有辦法訪問數據的原始所有者(指針)。
你的'原始'緩衝區在哪裏被使用? 'cstr'應該是'original'嗎? – mch 2010-04-12 04:04:03
你有什麼問題?是否有編譯器錯誤?除了變量名稱錯誤,以及我不瞭解你想用「剃鬚」完成什麼,完全是什麼問題?如果你認真對待使用C++,你應該使用'std :: string'而不是'char *',並且完全避免整個內存管理混亂。 – mch 2010-04-12 04:06:46
而且cstrn應該是cstr? – 2010-04-12 04:07:05