分享

std::list 在Win7 64位中可能存在不兼容,释放时堆内存异常,换为std:deque正常

 handup 2016-04-18
std::list 在Win7 64位中可能存在不兼容

环境:win7 64 
开发IDE: VS 2008 
代码大概:
typedef struct _zone_info
{
//分区所属的车站ID
int zone_station_id;
//分区所属设备IP
int zone_dev_ip; 
//分区所属设备ID 号,IP 后两个字节
int zone_dev_no;
//分区所属音频芯片的索引1-8
int zone_chip_index;  
//分区逻辑号类型-默认为0
int zone_logic_type;   
//分区逻辑号
int zone_logic_no;
//分区名字
char  zone_name[JH_DEVICE_NAME_LEN+1];

_zone_info & operator = (_zone_info & s )
{
memcpy( this, &s, sizeof( s ) );
return *this;
}
~_zone_info()
{
memset( this, 0, sizeof(_zone_info) );
}

}STRUCT_ZONE;

typedef struct _zone_group_info
{
int short_cut_index;
char short_cut_name[JH_DEVICE_NAME_LEN];
std::deque<STRUCT_ZONE> dequeZone;
_zone_group_info & operator = ( _zone_group_info & s )
{
short_cut_index = s.short_cut_index;
memset( short_cut_name, 0, sizeof(short_cut_name));
strcpy( short_cut_name, s.short_cut_name);
dequeZone.clear();
std::deque<STRUCT_ZONE>::iterator itQueZone;
for ( itQueZone = s.dequeZone.begin(); itQueZone != s.dequeZone.end(); itQueZone++ )
{
dequeZone.push_back( *itQueZone );
}
return *this;
}
~_zone_group_info()
{
short_cut_index = -1;
memset( short_cut_name, 0, sizeof(short_cut_name));
if ( !dequeZone.empty() )
{
dequeZone.clear();
}
}
}STRUCT_ZONE_GROUP;

typedef struct _callstation_info
{
int nGuid;
//设备类型
char  type;
//设备ID
unsigned int no;
//设备IP
unsigned int ip;
//设备网关
unsigned int gateway;
unsigned int netmask;
int cmd_type;
int subway_type;
//呼叫站逻辑号
int logic_no;
//呼叫站优先级
int priority;
//呼叫站所属车站;
int station_id;
/*话筒增益1-32*/
int mic_gain; 
/*线路增益1-32*/
int line_gain;
/*监听音量 1- 9*/
int lsp_vol;
/*数据端口号预留*/
int data_port; 
/*设备名字*/
char szName[JH_DEVICE_NAME_LEN+1];
std::deque<STRUCT_CALLSTATION_ZONE> dequeZone;
STRUCT_ZONE_GROUP zoneGroup[JH_CALLSTATION_GROUP_ZONE_NUM];
_callstation_info & operator = ( _callstation_info & s  )
{
nGuid = s.nGuid;
type = s.type;
no = s.no;
ip = s.ip;
gateway = s.gateway;
netmask = s.netmask;
cmd_type = s.cmd_type;
subway_type = s.subway_type;
logic_no = s.logic_no;
priority = s.priority;
station_id = s.station_id;
mic_gain = s.mic_gain; 
line_gain = s.line_gain;
lsp_vol = s.lsp_vol;
data_port = s.data_port; 
memset( szName, 0, sizeof(szName) );
strcpy( szName, s.szName );
dequeZone.clear();
std::deque<STRUCT_CALLSTATION_ZONE>::iterator itZone;
for ( itZone = s.dequeZone.begin(); itZone != s.dequeZone.end(); itZone++ )
{
dequeZone.push_back( *itZone );
}
for ( int i=0; i<JH_CALLSTATION_GROUP_ZONE_NUM; i++)
{
zoneGroup[i] = s.zoneGroup[i];
}
return *this;
}
~_callstation_info()
{
nGuid = 0;
type = 0;
no = 0;
ip = 0;
gateway = 0;
netmask = 0;
cmd_type = 0;
subway_type = 0;
logic_no = 0;
priority = 0;
station_id = 0;
mic_gain = 0; 
line_gain = 0;
lsp_vol = 0;
data_port = 0; 
memset( szName, 0, sizeof(szName) );
if ( !dequeZone.empty() )
{
dequeZone.clear();
}
}

}STRUCT_CALLSTATION;
CArray<STRUCT_CALLSTATION,STRUCT_CALLSTATION&> arrCallstation;

问题:开发的一个程序,在本机上,当执行arrCallstation.RemoveAt()时,出现堆内存释放错误。换为deque后,此现象没有了。并且在使用std::list里,运行在win7 32位机器上,没有问题。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多