当将std::string转换为char *时,SIGSEGV仅在应用程序的某些部分崩溃
SIGSEGV crash only in certain parts of my application when converting std::string to char *
我一直得到一个SIGSEGV
崩溃转换std::string
到char*
。我有一个名字,我希望在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
相关文章:
- 试图在visual studio上用C++创建一个桌面应用程序
- FFmpeg:制作一个应用程序比直接使用ffmepg更好吗
- 在C应用程序中运行C++(带有STL)函数
- 使用VerQueryValue检索应用程序的文件描述
- Qt C++静态thread_local QNetworkAccessManager是线程应用程序的好选择吗
- 使用调试/崩溃报告将应用程序部署到客户端
- C++控制台应用程序阻止退出
- 码头化的C++应用程序是否向后兼容早期的内核版本
- 将应用程序从32位移植到64位时出现问题
- 如何改变c++应用程序的视觉效果
- WM_CTLCOLORSTATIC从未在WIN32应用程序中触发
- PC中的程序和PHONE中的本机描述应用程序之间的数据连接
- 应用程序崩溃并显示"symbol _ZdlPvm, version Qt_5 not defined in file libQt5Core.so.5 with link time reference"
- 示例外壳应用程序显示的 V8 "segmentation fault (core dumped)"错误
- phytec phyBOARD iMX-6在从闪存而不是SD卡运行qt5 opengles应用程序时表现不佳(FPS减半
- 为什么导入Mixed native/CLR lib.dll的本机C++应用程序没有在Mixed lib.dll中的外部变
- 如何从Windows应用程序输出到标准?
- C++应用程序 MySQL odbc 数据库连接错误:在引发"otl_tmpl_exception<>"实例后终止调用
- 如何在 64 位 vb.net Windows 应用程序中引用 32 位 dll
- 如果整个应用程序是虚拟映射的,为什么 new 会进行系统调用?