尝试将字符连接到 char* 时引发异常
Posted
技术标签:
【中文标题】尝试将字符连接到 char* 时引发异常【英文标题】:Exception is thrown when trying to concatenate a character to char* 【发布时间】:2016-03-03 17:50:43 【问题描述】:以下是我创建 char* _strbuf 的代码。它将被创建,但将在内存中分配零空间
StringBuffer::StringBuffer()
char* _strbuf = (char*)malloc(sizeof(char)*_length);
private:
char* _strbuf; //buffer to store the original string
int _length=0;
现在,这是一个附加函数,它通过重新分配一个新空间来简单地将一个字符附加(连接)到这个 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
s
【问题讨论】:
仅供参考,没有理由将_length
乘以sizeof(char)
。 sizeof(char)
永远是 1。
猜测:零终止,检查返回值!
C 和 C++ 的完美结合……
@SergeyA 我不知道如何重新分配空间..!!我确实尝试过使用 new 但它只附加了垃圾值
@puffles,你需要分配新空间,将旧缓冲区复制到新空间并删除旧缓冲区。
【参考方案1】:
当你写作时:
StringBuffer::StringBuffer()
char* _strbuf = (char*)malloc(sizeof(char)*_length);
这不是malloc
成员 _strbuf
。 malloc
s 是一个名为_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
。
【讨论】:
修复它...!!但它现在也附加了一些垃圾值。 @puffles 您不会在任何地方以空值终止您的字符串。 上面提到的是我使用的仅有的两个函数,只有那些代码行@Barry @puffles 对,它们都不能确保_strbuf
是空终止的。以上是关于尝试将字符连接到 char* 时引发异常的主要内容,如果未能解决你的问题,请参考以下文章
当我尝试将我的应用程序连接到 Firebase 身份验证时出现 MissingPluginException 异常
尝试将docker容器连接到mongodb时出现异常打开套接字异常