锐英源软件
第一信赖

精通

英语

开源

擅长

开发

培训

胸怀四海 

第一信赖

当前位置:锐英源 / 开源技术 / C++开源心得 / std::map非法操作_Nodeptr _Pnode = _Root()和map状态异常
服务方向
人工智能数据处理
人工智能培训
kaldi数据准备
小语种语音识别
语音识别标注
语音识别系统
语音识别转文字
kaldi开发技术服务
软件开发
运动控制卡上位机
机械加工软件
软件开发培训
Java 安卓移动开发
VC++
C#软件
汇编和破解
驱动开发
联系方式
固话:0371-63888850
手机:138-0381-0136
Q Q:396806883
微信:ryysoft

锐英源精品开源,禁止转载和任何形式的非法内容使用,违者必究


std::map非法操作_Nodeptr _Pnode = _Root()和map状态异常


出错背景

最近完成一个股票项目,数据结构组织有个结构体,结构体里用了map指针,在一次修改后,突然在如下位置报非法操作:

_Nodeptr _Lbound(const key_type& _Keyval)
		{	// find leftmost node not less than _Keyval
		_Nodeptr _Pnode = _Root();
		_Nodeptr _Wherenode = this->_Myhead;	// end() if search fails

出错箭头指向_Root()行,且用监视器看指针的状态,有个数长度,但各个项为error,如下图:

map-error


网上参考

问过百度后,有个朋友说是数组溢出后,覆盖了map导致的。和我这情况不太匹配。


分析流程

出错就要先想最后改动,最后改动有2点:1、修改了map类型;2、在结构体的析构函数里delete了map的指针。

先查map类型问题。

可能是insert里参数类型不对,错误类型: map<time_t, MINUALL*>::value_type。 应该类型map<DWORD32, MINUALL*>::value_type 类型换了编译也没报错,可能是都是数值类型键吧。 想想,这个关系不大。

第2点是删除指针,但是在执行过程中,理论上不会执行析构函数,项目代码只是在退出应用时才析构啊!

再看结构体的成员函数,发现个函数:

	_tagUiShow& operator+=(const _tagUiShow _Right)

在这个函数里,有return *this;代码行,这个代码行会触发析构函数的执行,析构函数执行就会删除指针,并且有可能删除了别的结构体对象的指针,这样乱搞就让map指针内存异常,map析构肯定会处理项,也会让项看起来异常。


总结

error状态是map指针被删除但没清空指针,照样用的状态。因为指针不为空,但是指针的内存已经无效,所以执行map成员函数_Root()时出非法操作。

心得点:

1、map指针delete后注意清空。

2、结构体使用时,不要应用太多类机制。

3、在调用关系复杂时,指针的释放要尤其注意。

友情链接
版权所有 Copyright(c)2004-2021 锐英源软件
公司注册号:410105000449586 豫ICP备08007559号 最佳分辨率 1024*768
地址:郑州大学北校区院(文化路97号院)内