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_nameはタイプstd::stringです。によって返される値が指す文字シーケンスがヌル文字で終了するという保証はありませんdata()。簡単に言えば、文字列に実際に含まれているよりも多くの要素にプリントがアクセスする可能性があり、このセグメンテーション違反が発生します。

\0文字列の末尾に文字を追加するか、 null で終わることが保証されている文字に置き換えdata()てみてください。c_str()

于 2013-12-26T05:32:05.447 に答える