VS2010 swap()操作引起的问题
2011-06-08 11:08
253 查看
最近遇到一个VS2010的问题。
debug跟到代码里,才注意到有这个_Move() 之类的函数。
我遇到的问题是由于map::swap()引起的。
之前vs2005可以支持swap发生在不同的allocator下,现在会产生问题,估计是为了支持"右值引用"导致的。
虽然从vs2010的代码看起来,应该是继续提供支持的,放点代码过来:
void swap(_Myt& _Right)
{ // exchange contents with _Right
if (this == &_Right)
; // same object, do nothing
else if (get_allocator() == _Right.get_allocator())
{ // same allocator, swap control information
this->_Swap_all(_Right);
_Swap_adl(this->comp, _Right.comp);
_STD swap(this->_Myhead, _Right._Myhead);
_STD swap(this->_Mysize, _Right._Mysize);
}
else
{ // different allocator, do multiple assigns
_Myt _Tmp = _Move(*this);
*this = _Move(_Right);
_Right = _Move(_Tmp);
}
}
但是,由于这个_Move() 会间接调到_Assign_rv() 就会导致问题!
void _Assign_rv(_Myt&& _Right)
{ // assign by moving _Right
if (this == &_Right)
;
else if (get_allocator() != _Right.get_allocator())
_Xinvalid_argument("invalid map/set<T> move assign");
else
{ // clear this and steal from _Right
clear();
this->_Swap_all(_Right);
_Swap_adl(this->comp, _Right.comp);
_STD swap(this->_Myhead, _Right._Myhead);
_STD swap(this->_Mysize, _Right._Mysize);
}
}
debug跟到代码里,才注意到有这个_Move() 之类的函数。
我遇到的问题是由于map::swap()引起的。
之前vs2005可以支持swap发生在不同的allocator下,现在会产生问题,估计是为了支持"右值引用"导致的。
虽然从vs2010的代码看起来,应该是继续提供支持的,放点代码过来:
void swap(_Myt& _Right)
{ // exchange contents with _Right
if (this == &_Right)
; // same object, do nothing
else if (get_allocator() == _Right.get_allocator())
{ // same allocator, swap control information
this->_Swap_all(_Right);
_Swap_adl(this->comp, _Right.comp);
_STD swap(this->_Myhead, _Right._Myhead);
_STD swap(this->_Mysize, _Right._Mysize);
}
else
{ // different allocator, do multiple assigns
_Myt _Tmp = _Move(*this);
*this = _Move(_Right);
_Right = _Move(_Tmp);
}
}
但是,由于这个_Move() 会间接调到_Assign_rv() 就会导致问题!
void _Assign_rv(_Myt&& _Right)
{ // assign by moving _Right
if (this == &_Right)
;
else if (get_allocator() != _Right.get_allocator())
_Xinvalid_argument("invalid map/set<T> move assign");
else
{ // clear this and steal from _Right
clear();
this->_Swap_all(_Right);
_Swap_adl(this->comp, _Right.comp);
_STD swap(this->_Myhead, _Right._Myhead);
_STD swap(this->_Mysize, _Right._Mysize);
}
}
相关文章推荐
- mysql误操作引起的问题
- VS2010 MFC工程的MFC库使用方式与运行时库不一致引起的编译问题
- 同时安装了Windwos与LinuxOS 或 磁盘分区误操作等引起两个系统都无法启动问题的解决
- VS2010添加类失败问题,弹出错误框,提示 CodeModel操作失败,无法访问标记数据库
- 禁用约束和触发器(数据库操作时临时取消约束,来避开数据库约束的引起的操作问题)
- VS2010添加类失败问题,弹出错误框,提示 CodeModel操作失败,无法访问标记数据库
- VS2010 MFC工程的MFC库使用方式与运行时库不一致引起的编译问题
- 多线程操作stl::map引起的数据不一致问题的解决过程与方法
- VS2010代码编辑窗口第一次编辑操作导致报错的问题
- 关于Hibernate操作数据库为空(数值类型)以及引起的问题的一点点总结
- VS2010实际操作亲遇问题集锦
- 容器insert、erase操作引起迭代器失效问题
- VS2010添加类失败问题,弹出错误框,提示 CodeModel操作失败,无法访问标记数据库
- java.security.cert.CertificateException: Selenium 自动化的时候调用API 执行操作引起的关于https的问题
- chrome下,jquery对元素一些操作引起的问题
- 关于VS2010突然操作起来特别慢的问题
- VC线程中操作控件,引起程序卡死的问题。
- 故障重现(内存篇2),JAVA内存不足导致频繁回收和swap引起的性能问题
- Linux下vi操作出现“Found a swap file by the name。。。”警告问题
- VS2010 MFC工程的MFC库使用方式与运行时库不一致引起的编译问题