C++ C+中的分段错误+;-Rougewave(仅在linux中,不在unix中)
嗨,我的代码有内存故障。我使用了gdb并找出了内存故障发生的位置。但我无法解决这个问题。发生内存故障的代码行如下所示。请帮助我的朋友C++ C+中的分段错误+;-Rougewave(仅在linux中,不在unix中),c++,memory,gdb,segmentation-fault,rogue-wave,C++,Memory,Gdb,Segmentation Fault,Rogue Wave,嗨,我的代码有内存故障。我使用了gdb并找出了内存故障发生的位置。但我无法解决这个问题。发生内存故障的代码行如下所示。请帮助我的朋友 void CJob::print_parm_file(){ int m_nFuncid; CCmdset* pCmdset = NULL; const int size=1024; char fname[80]; char dbg_buf[size]=""; unsigned int i, gotit=0; for (i=0; i <
void CJob::print_parm_file(){
int m_nFuncid;
CCmdset* pCmdset = NULL;
const int size=1024;
char fname[80];
char dbg_buf[size]="";
unsigned int i, gotit=0;
for (i=0; i < entries(); i++)
{
pCmdset = (CCmdset*) at(i);
//RWCollectableString *cmdset = (RWCollectableString *)pCmdset->at(0);
//RWCString m_Function=cmdset->data();
CXmlobj *xobj = (CXmlobj *)pCmdset->at(0);
cout <<"The value of m_name.data() //segfault issue is : " << xobj->m_name << endl;
cout <<"The value of m_name.data() //segfault issue is : " << xobj->m_name.data() << endl;
RWCString m_Function=xobj->m_name.data(); //segmentation fault occurs in this line
void CJob::print\u parm\u file(){
国际货币基金组织;
CCmdset*pCmdset=NULL;
常量int size=1024;
char-fname[80];
char dbg_buf[大小]=“”;
无符号整数i,gott=0;
对于(i=0;iat(0);
//RWCString m_Function=cmdset->data();
CXmlobj*xobj=(CXmlobj*)pCmdset->at(0);
cout我有根据地猜测,m_name
属于std::string
类型。不能保证空字符会终止由data()
返回的值所指向的字符序列。简单地说,您的打印可能会访问比该字符串实际包含的元素更多的元素,从而导致此分段错误
请尝试在字符串末尾添加一个\0
字符,或将data()
替换为保证以空结尾的c_str()
。您是否首先确定xobj有效
CXmlobj *xobj = (CXmlobj *)pCmdset->at(0); // if xobj is invalid
xobj->m_name.data(); // ... then this will invoke undefined behavior
最简单的尝试就是将该字符串变量赋给一个临时字符串变量,看看会发生什么。如果仍然出现分段错误,那么问题很可能是xobj没有指向有效的CXmlobj。我使用strcpy命令而不是将值赋给m_函数。但问题是m_nme。数据没有值似乎是这样。哦。打印m\u name.data()
时是否发生故障?m\u name的类型是什么?
?是。当我打印m\u name.data()时,m\u name.data()不打印vzlue,它显示:m\u name.data()的值//segfault问题是:内存故障。m_名称的类型是:RWCString m_name;您不必手动分配空终止符。只需调用c_str()
而不是data()
。我在执行exe时遇到以下错误:\../Job.cpp:在成员函数'void CJob::print\u rpt\u file()中“:../Job.cpp:212:error:'class RWCString'没有名为'c_str'的成员make:**[Job.o]error 1只是一个注释,c样式强制转换类似于(CCmdset*)在C++中强烈地被禁止。你应该认真考虑使用C++的操作符,比如“代码> STATICEXCAST 和<代码> DyjiCaseCase<代码>。哦,我不知道。而且,这段代码在UNIX中工作得很好。分割错误只发生在Linux服务器中,这是一个有效的代码!……同一代码的行为是否不同?n linux和unix?我更新了我的帖子。请通过将该字符串分配给临时字符串来确保它确实有效。根据此链接:RWCString是一个写时复制的字符串。因此,将该字符串分配给一个临时字符串。如果它仍然存在故障,则xobj无效,或者您完全使用了COW字符串处理机制从某种程度上讲,这是一种非礼。