0

嗨,我的代码面临内存错误。我使用 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

我打印了 m_name.data() 的值来检查它的值。当我尝试打印它的值时,cout 语句本身发生了分段错误。

注意:此问题仅在 Linux 服务器中发生。该代码在 Unix 服务器上运行完美,没有任何问题。

请帮我 !谢谢 !!!

4

2 回答 2

0

您是否首先确定 xobj 是有效的?

CXmlobj *xobj = (CXmlobj *)pCmdset->at(0);  // if xobj is invalid
xobj->m_name.data();   // ... then this will invoke undefined behavior

最简单的尝试就是将该字符串变量分配给一个临时字符串变量,然后看看会发生什么。如果您仍然遇到分段错误,那么问题很可能是 xobj 未指向有效的 CXmlobj。

于 2013-12-26T07:10:22.043 回答
0

我有根据的猜测是m_nametype std::string。不能保证空字符会终止由 . 返回的值所指向的字符序列data()。简而言之,您的打印可能会访问比该字符串实际包含的更多元素,这会导致此分段错误。

尝试\0在字符串末尾添加一个字符,或替换data()c_str()保证以空字符结尾的字符。

于 2013-12-26T05:32:05.447 回答