打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
std::list 在Win7 64位中可能存在不兼容,释放时堆内存异常,换为std:deque正常
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位机器上,没有问题。
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
c++11-17 模板核心知识(十二)—— 模板的模板参数 Template Template Parameters
标准模板类(STL)(二),具体容器简介
STL中用erase()方法遍历删除元素
C++ STL详解
脚本引擎小PK: SpiderMonkey vs V8(二)
一些学习笔记 ,陷阱,缺陷
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服