Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 即使在使用新的_C++_Pointers - Fatal编程技术网

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,那将是非常有帮助的