首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

超难,C++高手来帮忙解决一下,内存显示和赋值结果不一致的有关问题

2012-04-01 
超难,C++高手来帮忙解决一下,内存显示和赋值结果不一致的问题有下面一段代码://ASN.1节点信息struct ASNNo

超难,C++高手来帮忙解决一下,内存显示和赋值结果不一致的问题
有下面一段代码: 
 //ASN.1节点信息
  struct ASNNodeTagInfo
  {
  ASNNodeTagInfo()
  :tag_value(0),index(0),next(NULL)
  {};

  ASNNodeTagInfo(const ASNNodeTagInfo& obj)
  {
  tag_value = obj.tag_value;
  index = obj.index;
  if(obj.next != NULL)
  next = new ASNNodeTagInfo(*obj.next);
  else
  next = NULL;
  };

  ~ASNNodeTagInfo()
  {
  delete next;
  };

  size_t tag_value;
  size_t index;

  ASNNodeTagInfo* next;
  };
//结构事件字段格式定义
  struct Table_Event_Field_Cfg
  {
  ASNNodeTagInfo* pASNNodeTagInfo;
  double length;
  int field_cfg_id;
  int record_cfg_id;
  int data_type_id;//编码方式
  /* int event_attr_id;*/
  int seq_nbr;
  int data_offset;
  int data_seek_end;
  int iden_len;
  int delimit_str_len;
  int i_field_iden;
  bool is_hex_iden;
  //char name[MD_NAME_LEN + 1];
  char field_iden[PRE_LENFOR_FIELD_IDEN_1 + 1];
  char type_of_length[PRE_LENFOR_TYPE_OF_LENGTH + 1];
  char delimit_str[PRE_LENFOR_DELIMIT_STR + 1];
  char state_date[SIZE_DATE_TIME];
  char state[PRE_LENFOR_STATE + 1];
  char verify_flag[PRE_LENFOR_VERIFY_FLAG + 1];//字段校验标志
  Table_Event_Field_Cfg(){memset(this, 0x00, sizeof(Table_Event_Field_Cfg));};
  Table_Event_Field_Cfg(const Table_Event_Field_Cfg& obj)
  {
  memcpy(this,&obj,sizeof(Table_Event_Field_Cfg));
  if(obj.pASNNodeTagInfo != NULL)
  pASNNodeTagInfo = new ASNNodeTagInfo(*obj.pASNNodeTagInfo);
  };
  ~Table_Event_Field_Cfg(){
  if (NULL != pASNNodeTagInfo)
  {
  delete pASNNodeTagInfo;
  pASNNodeTagInfo = NULL;
  }
  };
  };

 //通用缓存配置
  struct CBufferCfg
  {
  int num;
  char type_of_length;
  const char* iden;
  const char* delimit_str;
  double length;
  int data_offset;
  int data_seek_end;
  CBufferType buffer_type;
  const void* pFactBufferCfg;
  int iden_len;
  int delimit_str_len;
  int seq_nbr;
  int iden_value;

  CBufferCfg(const Table_Event_Field_Cfg* pEvent_Field_Cfg)
  {
  num = 1;
  type_of_length = pEvent_Field_Cfg->type_of_length[0];
  iden = pEvent_Field_Cfg->field_iden;
  delimit_str = pEvent_Field_Cfg->delimit_str;
  length = pEvent_Field_Cfg->length;
  data_offset = pEvent_Field_Cfg->data_offset;
  data_seek_end = pEvent_Field_Cfg->data_seek_end;


  iden_len = pEvent_Field_Cfg->iden_len;
  delimit_str_len = pEvent_Field_Cfg->delimit_str_len;
  seq_nbr = pEvent_Field_Cfg->seq_nbr;
  iden_value = pEvent_Field_Cfg->i_field_iden;
  buffer_type = BT_FIELD;
  pFactBufferCfg = pEvent_Field_Cfg;
  }
};
当调用CBufferCfg buffer(pCfg);得到buffer中的数据跟pCfg中对应的数据不一致,其中pCfg类型为const Table_Event_Field_Cfg*类型,
开始以为是运行的.o文件跟最新代码的不一致引起的,但是我把debug目录中的所有文件都删除后完全重新编译了还是这样
如:pEvent_Field_Cfg->type_of_length为“3”,但是赋值后type_of_length为0


[解决办法]
调试一下嘛,观察一下变量,可能哪里数组越界了
[解决办法]
仔细跟踪赋值过程,注意赋值前后被赋值对象是不是真的运行了,以及赋值前后变量的值是不是变化了
还要观察赋值之前某些步骤上是不是有不应该改变的变量改变了,如果有则很可能是数组越界!
是在不行,可能就是编译和调试环境的问题,改用Release版本试试,看不到值就将他打出来!
[解决办法]
个人感觉,NULL指针只是表象,得彻查

热点排行