以下是我的String缓冲类的代码。我在构造函数中用_strbuf
初始化了new char[length]
指针。现在我想追加它,所以我在第一次调用length+1
之后创建了一个带有delete [] _strbuf
的新指针,以避免内存泄漏。然后将其分配给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 :(得分: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
。
- 编辑 -
如果您可以访问C ++ 11(过去几年的所有现代编译器),我还建议您使用nullptr
代替0
答案 1 :(得分:-1)
解决这个问题的方法是不重写其他人编写的代码,但更糟糕的是。只需使用std::string
代替,此问题就会自行解决。