精通
英语
和
开源
,
擅长
开发
与
培训
,
胸怀四海
第一信赖
锐英源精品开源,禁止转载和任何形式的非法内容使用,违者必究
最近完成一个股票项目,数据结构组织有个结构体,结构体里用了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导致的。和我这情况不太匹配。
出错就要先想最后改动,最后改动有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、在调用关系复杂时,指针的释放要尤其注意。