即使用new初始化char指针后也会出现断言错误

时间:2016-03-04 19:39:47

标签: c++ pointers

以下是我的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;

}

2 个答案:

答案 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代替,此问题就会自行解决。