C++ 即使在使用新的
下面是我的字符串缓冲区类代码。我已经用构造函数中的C++ 即使在使用新的,c++,pointers,C++,Pointers,下面是我的字符串缓冲区类代码。我已经用构造函数中的新字符[length]初始化了我的\u strbuf指针。现在我想附加它,所以我在第一次调用delete[]\u strbuf后创建了一个新指针,其长度为length+1,以避免内存泄漏。然后将其分配给长度为长度+1的新指针 但是它给出了一个错误\u BLOCK\u TYPE\u是有效的。如果我删除delete[]\u strbuf,它可以正常工作,但会出现内存泄漏 StringBuffer::StringBuffer() { _strb
新字符[length]
初始化了我的\u strbuf
指针。现在我想附加它,所以我在第一次调用delete[]\u strbuf
后创建了一个新指针,其长度为length+1
,以避免内存泄漏。然后将其分配给长度为长度+1
的新指针
但是它给出了一个错误\u BLOCK\u TYPE\u是有效的
。如果我删除delete[]\u 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;
}
下面是我的append函数:
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;
}问题在于:
_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
),也不会处理长度为nullptr
的新闻字符串
--编辑--
我还鼓励您使用
nullptr
而不是0
作为指针,如果您可以访问C++11(过去几年以来的所有现代编译器)解决此问题的方法是不重写其他人编写的代码,而是更糟的代码。只需使用std::string
即可解决此问题 删除空指针是完全有效的。不需要检查。我使用了复制构造函数和赋值重载。我已经编辑了上面的代码。我仍然需要使用std::copy line?@user3585510您可以将std::copy
替换为strncpy
/strcpy
,就像您在操作符中所做的那样。您希望在构造函数中将\u strbuf
分配给哪个指针:new char[length]
或newString
?不可能两者都是,您当前的代码就是这样运行的。在我的构造函数中,我想将字符串pass作为newString复制到我的strbuff中,但您没有复制它。您正在覆盖strbuf指针,并丢失刚才分配的新内存。您需要将字符复制到新缓冲区中。这是问题之一:\u strbuf=new char[length]_strbuf=新闻字符串代码>我使用了运算符重载。我应该做什么来复制我的strbuf中的新闻字符串你的赋值操作符可以是一个简单的4行函数,不需要调用new
或delete
(使用复制/交换)。通过更改你的问题,你已经不清楚你在问什么了。我们不知道在类崩溃时您是如何尝试使用它的。正如blazs和我所指出的,显而易见的问题是在构造函数中,但现在您展示了一堆其他代码,这些代码看起来像是std::string的糟糕实现,我们不知道您是不知道std::string,还是这是您试图完成的作业。@user3585510首先,这是作业吗?如果没有,请使用std::string
并使用所有这些代码删除。如果这是一个作业,并且您正在尝试学习,那么有大量的资源展示了如何正确地组合一个字符串类。可能在犯基本错误之前仔细阅读这些示例,正如blazs所指出的那样?我必须自己实现复制的指针,所以我应该在哪里使用std::string?而不是char*\u str\u bufb但我必须。。这是我的任务如果你能告诉我如何在我的构造函数中将新闻字符串复制到我的strbuf,那将是非常有帮助的