以下是我创建char * _strbuf的代码。它将被创建但在内存中将为其分配零空间
StringBuffer::StringBuffer() {
char* _strbuf = (char*)malloc(sizeof(char)*_length);
}
private:
char* _strbuf; //buffer to store the original string
int _length=0;
现在,这是一个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;
}
分配存在某种问题。
PS:我试图实现StringBuffer类。不允许std::string
答案 0 :(得分:6)
当你写:
StringBuffer::StringBuffer() {
char* _strbuf = (char*)malloc(sizeof(char)*_length);
}
那不是malloc
成员 _strbuf
。 malloc
个本地变量名为_strbuf
,其名称恰好与您的成员_strbuf
相同。但该成员仍然没有初始化。
所以当你这样做的时候:
_strbuf = (char*)realloc(_strbuf, sizeof(char) * _length);
此操作失败,因为先前未_strbuf
分配malloc()
。
要解决这个问题,只需将您在构造函数中执行的操作从声明更改为赋值:
StringBuffer::StringBuffer() {
_strbuf = (char*)malloc(sizeof(char)*_length);
}
可以移动到mem-initializer-list中以避免混淆:
StringBuffer::StringBuffer()
: _strbuf((char*)malloc(sizeof(char)*_length))
{ }
修复后,C / C ++中的字符串必须以空值终止。你在任何地方都没有考虑到这一点。您需要确保缓冲区中的最后一个字符始终为\0
。