免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2134 | 回复: 3
打印 上一主题 下一主题

请教类实例指针的问题,急急急!!! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-09-06 00:46 |只看该作者 |倒序浏览
我今天遇到一个很棘手的问题,检查了一整天了,但一直查不出问题所在,所以得请教高手了:
    :就是在一个成员函数中调用m_pComparator->CompCounter2Self(),执行之前(p *m_pComparator )内容都有,紧接着一步,这个调用之后,我要判断执行成功与否,就调用(if (m_pComparator->GetErrMsg() != string(""))),奇怪的是,这个时候(p *m_pComparator )发现m_pComparator 里面的成员变量和成员函数均被初始化了(见下面的结果)。所以每次执行m_pComparator->GetErrMsg() 都会coredump。这是什么原因呢?怎么能导致m_pComparator 被初始化呢?

    给指点一下。不胜感激!!!!!!!!
    m_pComparator->CompCounter2Self();
    if (m_pComparator->GetErrMsg() != string(""))
    {
        m_strErrMsg = m_pComparator->GetErrMsg();
    }

482         m_pComparator->CompCounter2Self();
(gdb) p *m_pComparator     
$1 = {m_sCityCode = "778", m_iServiceKind = 0, m_iMonth = 8, m_iDay = 5, m_iTopic = 1, m_iSource = 0, m_bIsCounterNumber = true,
  m_iCallDateErr = 6, m_iDurationErr = 3, m_pSelfCallDetail = 0x0, m_pCounterCallDetail = 0x0, m_pSelfTree = 0x8000000100065d20,
  m_pCounterTree = 0x8000000100065ea8, m_pCompareIndb = 0x800000010006f648, m_pCurrCallDetail = 0x0,
  m_strRunningState = {<class std::allocator<char>> = {<No data fields>}, static npos = 18446744073709551615, static __nullref = {
      __ref_hdr_ = {__mutex_ = {<class __rw::__rw_mutex_base> = {_C_mutex = {<No data fields>}}, <No data fields>}, __refs_ = 1,
        __capacity_ = 0, __nchars_ = 0}, __eos_char_ = 0 '\000'}, _C_data = 0x800003fffe8923f8 ""},
  m_strErrMsg = {<class std::allocator<char>> = {<No data fields>}, static npos = 18446744073709551615, static __nullref = {
      __ref_hdr_ = {__mutex_ = {<class __rw::__rw_mutex_base> = {_C_mutex = {<No data fields>}}, <No data fields>}, __refs_ = 1,
        __capacity_ = 0, __nchars_ = 0}, __eos_char_ = 0 '\000'}, _C_data = 0x800003fffe8923f8 ""},
  m_pIndbLog = 0x0, __vfp = 0x800000010000bd58}
(gdb) p m_pComparator->GetErrMsg()
$2 = {<class std::allocator<char>> = {<No data fields>}, static npos = 18446744073709551615, static __nullref = {__ref_hdr_ = {
      __mutex_ = {<class __rw::__rw_mutex_base> = {_C_mutex = {<No data fields>}}, <No data fields>}, __refs_ = 1,
      __capacity_ = 0, __nchars_ = 0}, __eos_char_ = 0 '\000'}, _C_data = 0x800003fffe8923f8 ""}


顺利执行之后:
483         if (m_pComparator->GetErrMsg() != string(""))
(gdb) p *m_pComparator
$3 = {m_sCityCode = "\000\000", m_iServiceKind = 0, m_iMonth = 0, m_iDay = 0, m_iTopic = 0, m_iSource = 0,
  m_bIsCounterNumber = false, m_iCallDateErr = 0, m_iDurationErr = 0, m_pSelfCallDetail = 0x0, m_pCounterCallDetail = 0x0,
  m_pSelfTree = 0x0, m_pCounterTree = 0x0, m_pCompareIndb = 0x0, m_pCurrCallDetail = 0x0,
  m_strRunningState = {<class std::allocator<char>> = {<No data fields>}, static npos = 18446744073709551615, static __nullref = {
      __ref_hdr_ = {__mutex_ = {<class __rw::__rw_mutex_base> = {_C_mutex = {<No data fields>}}, <No data fields>}, __refs_ = 1,
        __capacity_ = 0, __nchars_ = 0}, __eos_char_ = 0 '\000'}, _C_data = 0x0},
  m_strErrMsg = {<class std::allocator<char>> = {<No data fields>}, static npos = 18446744073709551615, static __nullref = {
      __ref_hdr_ = {__mutex_ = {<class __rw::__rw_mutex_base> = {_C_mutex = {<No data fields>}}, <No data fields>}, __refs_ = 1,
        __capacity_ = 0, __nchars_ = 0}, __eos_char_ = 0 '\000'}, _C_data = 0x0}, m_pIndbLog = 0x0, __vfp = 0x0}

Program received signal SIGSEGV, Segmentation fault.
0x40000000000dd880 in std::basic_string<char,std::char_traits<char>,std::allocator<char>>::basic_string<char,std::char_traits<char>,std::allocator<char>>+0x64 ()
(gdb)

论坛徽章:
0
2 [报告]
发表于 2007-09-06 10:38 |只看该作者
如果CompCounter2Self和GetErrMsg都没问题那么


  1.     m_pComparator->CompCounter2Self();
  2.     if (m_pComparator->GetErrMsg() != string(""))
  3.     {
  4.         m_strErrMsg = m_pComparator->GetErrMsg();
  5.     }
复制代码


就不会有问题

可以参考下面的例子


  1. #include <stdio.h>

  2. #include <vector>
  3. #include <string>
  4. #include <iostream>
  5. using namespace std;


  6. class A {
  7.        
  8. public:       
  9.         void CompCounter2Self() {}
  10.        
  11.         string GetErrMsg()
  12.         {
  13.                 return string("error");
  14.         }
  15. };


  16. int main()
  17. {
  18.         A *m_pComparator = new A;
  19.         string m_strErrMsg;
  20.        
  21.         m_pComparator->CompCounter2Self();
  22.     if (m_pComparator->GetErrMsg() != string(""))
  23.     {
  24.         m_strErrMsg = m_pComparator->GetErrMsg();
  25.         
  26.         cout << m_strErrMsg << endl;
  27.     }
  28. }


复制代码



出coredump,我想可能是在函数CompCounter2Self里做了什么不应该做的操作...

论坛徽章:
0
3 [报告]
发表于 2007-09-06 14:00 |只看该作者

回复 #2 prc 的帖子

出coredump,我想可能是在函数CompCounter2Self里做了什么不应该做的操作...

我想是在这里。
怀疑是m_pComparator->CompCounter2Self(),中的memset(m_pkIndbBatch, 0x0, g_iInsertBatchNum * sizeof(KCompareIndb));
覆盖了其他内存。

我注释掉就好了。
而m_pkIndbBatch = new KCompareIndb[g_iInsertBatchNum];使用之前memset有问题吗?没看出来问题。

论坛徽章:
0
4 [报告]
发表于 2007-09-06 17:07 |只看该作者
不是先new再memset吗
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP