尝试将字符连接到char时抛出异常*

puf*_*les 0 c++

以下是我创建char*_strbuf的代码.它将被创建,但在内存中将为其分配零空间

StringBuffer::StringBuffer() {     
    char* _strbuf = (char*)malloc(sizeof(char)*_length);
}

private:
    char* _strbuf;  //buffer to store the original string
    int _length=0;
Run Code Online (Sandbox Code Playgroud)

现在,这是一个append函数,它只是通过重新分配一个新的空格将一个字符附加(连接)到这个char*

void StringBuffer:: append(char c) {
    _length++;
    _strbuf = (char*)realloc(_strbuf, sizeof(char) * _length);
    cout << "\n";
    cout << _strbuf;
    _strbuf[_length-1] = c; //exception thrown here        
    cout << _strbuf;
}
Run Code Online (Sandbox Code Playgroud)

分配存在某种问题.PS:我试图实现StringBuffer类.没有std::string小号允许

Bar*_*rry 6

当你写:

StringBuffer::StringBuffer() {    
    char* _strbuf = (char*)malloc(sizeof(char)*_length);
}
Run Code Online (Sandbox Code Playgroud)

malloc成员 _strbuf.这malloc是一个名为的局部变量_strbuf,它恰好与您的成员具有相同的名称_strbuf.但该成员仍然没有初始化.

所以,当你这样做时:

_strbuf = (char*)realloc(_strbuf, sizeof(char) * _length);
Run Code Online (Sandbox Code Playgroud)

这失败了,因为_strbuf以前没有分配过malloc().

要解决这个问题,只需将您在构造函数中执行的操作从声明更改为赋值:

StringBuffer::StringBuffer() {    
    _strbuf = (char*)malloc(sizeof(char)*_length);
}
Run Code Online (Sandbox Code Playgroud)

可以将其移动到mem-initializer-list中以避免混淆:

StringBuffer::StringBuffer()
    : _strbuf((char*)malloc(sizeof(char)*_length))
{ }
Run Code Online (Sandbox Code Playgroud)

解决之后,C/C++中的字符串必须以null结尾.你在任何地方都没有考虑到这一点.您需要确保缓冲区中的最后一个字符始终是\0.