尝试将字符连接到 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::strings

【问题讨论】:

仅供参考,没有理由将_length 乘以sizeof(char)sizeof(char) 永远是 1。 猜测:零终止,检查返回值! C 和 C++ 的完美结合…… @SergeyA 我不知道如何重新分配空间..!!我确实尝试过使用 new 但它只附加了垃圾值 @puffles,你需要分配新空间,将旧缓冲区复制到新空间并删除旧缓冲区。 【参考方案1】:

当你写作时:

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

这不是malloc 成员 _strbufmallocs 是一个名为_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* 时引发异常的主要内容,如果未能解决你的问题,请参考以下文章

PL/SQL 异常和错误处理

当我尝试将我的应用程序连接到 Firebase 身份验证时出现 MissingPluginException 异常

尝试将数字写入二进制文件时引发异常

尝试将docker容器连接到mongodb时出现异常打开套接字异常

尝试将 Java 应用程序连接到 Redshift 数据库时服务器关闭连接

尝试连接到 Activiti 的 H2 数据库设置时出现异常