2016-03-04 56 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