【问题标题】:SEGV signal while getting the length of a string获取字符串长度时的 SEGV 信号
【发布时间】:2013-06-28 13:02:25
【问题描述】:

我有以下代码:

int Class::set(const char *  id_tran_typ_)
{
        char *trimmed_id_tran_typ_ = NULL;
        trimString(id_tran_typ_, &trimmed_id_tran_typ_);
        int len = strlen(trimmed_id_tran_typ_);
        if (len < 1)
                _id_tran_typ = DEFAULT_STRING;
        else
                _id_tran_typ = id_tran_typ_;
        delete[] trimmed_id_tran_typ_;
        trimmed_id_tran_typ_ = NULL;
        return SUCCESS;
}

在这里,我在 int len = strlen(trimmed_id_tran_typ_); 处收到一个 SEGV 信号

trimString 函数是这样的:

char *trimString(const char *sP_, char **dP_)
{

        *dP_ = NULL;

        if (sP_ == NULL)
                return *dP_;

        const char *lastPos = (char *)&sP_[strlen(sP_)];
        const char *startPos = (char *)sP_;
        const char *endPos = lastPos;

        int len = strlen(sP_);

        for (; endPos != sP_; endPos--)
        {
                if (*(endPos - 1) != ' ')
                {
                        len = endPos - sP_; // *endPos = '\0';
                        break;
                }
        }
        if (len == 0) // if (*endPos != '\0')
        {
                *dP_ = new char[1];
                *dP_[0] = '\0';
                return *dP_;
        }
        for(; startPos < endPos; startPos++, len--)
        {
                if (*startPos != ' ')
                        break;
        }
        if (startPos == endPos)
        {
                *dP_ = new char[1];
                *dP_[0] = '\0';
                return *dP_;
        }

        *dP_ = STRDUP(startPos, len);
        return *dP_;
}

现在我的问题很明显,为什么我在这里遇到分段错误。

是不是因为我没有收到set() 函数中由trimString() 函数发送的字符串?


这就是STRDUP() 的样子:

char *STRDUP(const char *sP_, const int len_)
{
        if (! sP_)
                return NULL;
        else if (len_ < 1)
                return NULL;

        char *newP = new char [ len_ + 1] ;
        memset(newP, '\0', len_+1);
        strncpy(newP, sP_, len_);
        return(newP);
}

【问题讨论】:

  • 你漏掉了最重要的部分:STRDUP
  • 除了前面提到的STRDUP,你怎么称呼set
  • set() 的调用如何与这里的分段错误联系起来?
  • 你进行了哪些调试?此代码的 all 是否直接导致段错误?我对此表示怀疑。 sscce.org
  • 实际上这个set() 函数是从Class 类的构造函数中调用的。基本上Class 对象被推入队列。第一个对象被推得很好。但正是从第二个开始,才引起了所有的痛苦。构造函数在某处被调用 Sample = new Class();

标签: c++ string segmentation-fault


【解决方案1】:

您的STRDUP 函数返回一个空指针或id_tran_typ_ 是一个空指针。

【讨论】:

  • STRDUP 函数是这样的
【解决方案2】:

最可能的解释是调用Class::set 方法时将id_tran_type_ 设置为NULL。您可以通过在检查长度之前检查 trimmed_id_tran_typ_ 值是否为 NULL 来解决此问题。

int Class::set(const char *  id_tran_typ_)
{
    char *trimmed_id_tran_typ_ = NULL;
    trimString(id_tran_typ_, &trimmed_id_tran_typ_);
    if (!trimmed_id_tran_typ_ || strlen(trimmed_id_tran_typ_) < 1)
        _id_tran_typ = DEFAULT_STRING;
    else
        _id_tran_typ = id_tran_typ_;
    delete[] trimmed_id_tran_typ_;
    trimmed_id_tran_typ_ = NULL;
    return SUCCESS;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多