当将std::string转换为char *时,SIGSEGV仅在应用程序的某些部分崩溃

SIGSEGV crash only in certain parts of my application when converting std::string to char *

本文关键字:应用程序 些部 崩溃 SIGSEGV 转换 string std char 当将      更新时间:2023-10-16

我一直得到一个SIGSEGV崩溃转换std::stringchar*。我有一个名字,我希望在ITextControl (WDL框架)中显示。下面的代码片段在我的应用程序的某些部分可以正常工作,但在这里不行:

char * paramName = new char[name.size() + 1];
std::copy(name.begin(), name.end(), paramName);
paramName[name.size()] = ''; // don't forget the terminating 0
lcdToWriteParamNamesTo->SetTextFromPlug(paramName);

跟踪....

void ITextControl::SetTextFromPlug(char* str)
{
  if (strcmp(mStr.Get(), str))
  {
    SetDirty(false);
    mStr.Set(str);
  }
}
下步骤:

char *Get()
{
  if (m_hb.GetSize()) return (char *)m_hb.Get();
  static char c; c=0; return &c; // don't return "", in case it gets written to.
}

最后CRASH!:

int GetSize() const { return m_size; }

按要求编辑:

void WDL_STRING_FUNCPREFIX Set(const char *str, int maxlen WDL_STRING_DEFPARM(0))
{
  int s=0;
  if (str)
  {
    if (maxlen>0) while (s < maxlen && str[s]) s++;
    else s=(int)strlen(str);   
  }
  __doSet(0,str,s,0);
}

从我对c++和这个答案的有限理解来看,边界问题可能导致SIGSEGV或写入只读内存。

只是为了澄清一下,这个代码片段在一个类中总是崩溃,而在另一个类中永远不会崩溃,尽管两个类都传递了相同的字符串和ITextControl。

有谁能帮我解释一下这个吗?

编辑:建议使用c_str()没有帮助:

char * cstr = new char [name.length()+1];
std::strcpy (cstr, name.c_str());
lcdToWriteParamNamesTo->SetTextFromPlug(cstr);
delete[] cstr;

转换字符串似乎没有问题。

SIGSEGV被无效的内存引用触发。意思是当你试着从lcdToWriteParamNamesTo->mStr->m_hb->m_size从未获得的内存中读取。

其中一个对象可能已经被销毁,或者错误地覆盖了其中一个指针,指向未获取的内存:

  • lcdToWriteParamNamesTo
  • mStr
  • m_hb
  • m_size