【发布时间】: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