将 std::string 转换为 char * 时,SIGSEGV 仅在我的应用程序的某些部分崩溃
SIGSEGV crash only in certain parts of my application when converting std::string to char *
在将 std::string
转换为 char*
时,我总是遇到 SIGSEGV
崩溃。我有一个我希望在 ITextControl(WDL 框架)中显示的名称。以下代码片段在我的应用程序的某些部分运行良好,但在此处却不行:
char * paramName = new char[name.size() + 1];
std::copy(name.begin(), name.end(), paramName);
paramName[name.size()] = '[=11=]'; // 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.
}
终于崩溃了!:
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++ 和 this 答案的有限理解,边界问题可能会导致 SIGSEGV 或写入只读内存。
澄清一下,这个片段在一个 class 中总是崩溃,而在另一个 class 中永远不会崩溃,尽管两个 classes 都传递了相同的字符串和 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
在将 std::string
转换为 char*
时,我总是遇到 SIGSEGV
崩溃。我有一个我希望在 ITextControl(WDL 框架)中显示的名称。以下代码片段在我的应用程序的某些部分运行良好,但在此处却不行:
char * paramName = new char[name.size() + 1];
std::copy(name.begin(), name.end(), paramName);
paramName[name.size()] = '[=11=]'; // 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.
}
终于崩溃了!:
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++ 和 this 答案的有限理解,边界问题可能会导致 SIGSEGV 或写入只读内存。
澄清一下,这个片段在一个 class 中总是崩溃,而在另一个 class 中永远不会崩溃,尽管两个 classes 都传递了相同的字符串和 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