Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C+中的分段错误+;-Rougewave(仅在linux中,不在unix中)_C++_Memory_Gdb_Segmentation Fault_Rogue Wave - Fatal编程技术网

C++ C+中的分段错误+;-Rougewave(仅在linux中,不在unix中)

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 <

嗨,我的代码有内存故障。我使用了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 < 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字符串处理机制从某种程度上讲,这是一种非礼。