2016-03-04 17 views
-1

以下是我的字符串緩衝區類的代碼。我在構造函數中初始化了我的_strbuf指針,其中new char[length]。現在我想追加它,所以我在第一次調用delete [] _strbuf之後創建了一個新指針length+1以避免內存泄漏。然後將其分配給length+1的新指針。甚至在用新的字符型初始化指針後聲明錯誤

但它給出了_BLOCK_TYPE_IS_VALID的錯誤。如果我刪除delete[] _strbuf,它工作正常,但會有內存泄漏。

StringBuffer::StringBuffer() { 
    _strbuf = 0; // char pointer 
    _length = 0; // integer 
} 
StringBuffer::StringBuffer(char* newString, int length) { 
    _length = length; 
    //delete[] _strbuf; 
    _strbuf = new char[length]; 
    _strbuf = newString; 
} 
StringBuffer::~StringBuffer() { 
    delete[] _strbuf; 
    _strbuf=0; 
} 

這裏是我的附加功能:

void StringBuffer::append(char c) { 
    _length=_length+1; 
    char* newbuf = new char[_length]; 
    revSmartCopy(newbuf); // just copying the original string into new string 
    delete[] _strbuf;  //commenting out this line and code run fine but memory leaks 
    _strbuf=newbuf; 
    _strbuf[_length]=c; 
    newbuf = 0; 
} 

StringBuffer::StringBuffer(const StringBuffer& newString) { 
if(newString._strbuf) 
{ 
    _strbuf = new char[newString.length()]; 
    _length = newString.length(); 
    strncpy(_strbuf,newString._strbuf,_length); 
} 
else{ 
    _strbuf = 0; 
} 

} 

StringBuffer& StringBuffer::operator=(const StringBuffer& newString){ 
if(this == &newString) 
    return *this; 

delete[] _strbuf; 
_length = newString._length; 

if(newString._strbuf){ 
    _strbuf = new char[_length]; 
    strncpy(_strbuf,newString._strbuf,_length); 
} 
else{ 
    _strbuf=0; 
} 

return *this; 

}

+0

這是一個問題:'_strbuf = new char [length]; _strbuf = newString;' – blazs

+0

我已經使用了運算符重載。我應該怎麼做才能將該新聞串複製到我的_strbuf – user3585510

+0

您的賦值運算符可能是一個簡單的4行函數,不會調用'new'或'delete'(使用複製/交換)。 – PaulMcKenzie

回答

0

問題是這樣的:

_strbuf = new char[length]; 
_strbuf = newString; 
在構造函數

;在new緩衝區之後,將其覆蓋值爲newString。它看起來像你預期的是

_strbuf = new char[length]; 
std::copy(_strbuf, _strbuf + length, newString); 

(編輯)或匹配您在別處使用的方法:

_strbuf = new char[length]; 
strncpy(_strbuf, newString, length); 

但是請注意,這個失去後'\0'終止。它也不檢查長度爲零(newBuf將爲nullptr)或處理newString爲nullptr

- 編輯 -

我也建議你使用nullptr而不是0爲指針,如果您有(從過去幾年的所有現代的編譯器)進入C++ 11

+0

刪除空指針是完全有效的。沒有檢查是必要的。 – PaulMcKenzie

+0

我已經使用了複製構造函數和賦值重載。我編輯了上面的代碼。我仍然需要使用std :: copy line? – user3585510

+0

@ user3585510你可以用'strncpy' /'strcpy'替換'std :: copy',就像你在運算符中一樣。你打算在你的構造函數中分配'_strbuf'哪個指針:'new char [length]'或'newString'?它不能同時存在,並且當前的代碼就是這樣的。 – kfsone

-1

解決這個問題的方法是不重寫別人寫的代碼,但更糟的是。只需使用std::string,這個問題將自行解決。

+0

我必須自己實現複製的指針,所以我應該在哪裏使用std :: string?而不是char * _str_buf – user3585510

+0

不要自己實現複製的指針。 – Puppy

+0

但我必須......那是我的任務 – user3585510