hur.cn - 华软网

 热门搜索

std::sort加谓词做排序,碰到了CString内部复制构造函数断言失败

  作者:未知    来源:网络    更新时间:2011/3/5
各位哥们,大牛,情况是这样的。
我有个结构体:
C++">
struct USER_PORP
{
int nId;
CString strName;
int nPropMain;
int nPropSubSub;
USER_PORP()
{
nPropMain = 0;
nPropSubSub = 0;
}
USER_PORP(const USER_PORP& userPorp)
: nMedId(userPorp.nId) , strName(userPorp.strName) ,
nPropMain(userPorp.nPropMain) , nPropSubSub(userPorp.nPropSubSub)
{
}
};


在使用中用vector容器存储这个结构体:
C++">
std::vector<USER_PORP> vctUserInfo;


然后自己写了个谓词判断,用std::sort(vctUserInfo.begin(),vctUserInfo.end(),cmp); 排序
PS:cmp谓词函数中没有用到CString,是用结构体的其他成员作判断的

在排序中调用谓词函数时,传入了一个越界的相当于vctUserInfo.end()的值
结果CString的复制构造函数就在断言ASSERT(stringSrc.GetData()->nRefs != 0);处失败
程序崩溃~~~~~~~~~~~~~ 悲剧

我该怎么办? 请各位帮忙!
---华软 网友回答---
自己顶一下,有人碰到过吗?
---华软网友回复---
用stl的话,最好不要用mfc的类对象,还有你的判断函数写的是否有问题
---华软网友回复---
判断函数写的很简单,应该没什么问题的
---华软网友回复---
cmp
 函数???代码???
---华软网友回复---
C++">
bool cmp(USER_PORP a,USER_PORP b)
{
if(a.nPropMain > b.nPropMain)
{
return true;
}
else if(a.nPropMain == b.nPropMain && a.nPropSubSub >= b.nPropSubSub)
{
return true;
}
return false;
}

---华软网友回复---
cmp谓词函数在使用中,有很多情况是OK的,比较数据过多的情况下发生刚才断言失败
---华软网友回复---
那请问,如何判断扔到复制构造函数中的CString对象是无效的?
---华软网友回复---
我刚用了list.sort 根据对象的文件名排序 strcmp(a,b),a>b则返回值>0 . 
你试试CString.GetBuffer 字符串char*排序.
---华软网友回复---
谢谢楼上兄弟,实际上排序不是用CString的,只不过是那个结构体中的一个值
我觉得既然有问题,而且短期解决不了,索性就在排序结构体中不放CString这个结构
后面补上。
---华软网友回复---
在非MFC环境下建议最好不使用MFC的类
---华软网友回复---
可能是其他代码访问越界, 破坏了CString, 
CString应该是没问题的, 自己重建个工程, 看能否重现问题, 如果还有问题, 可以发代码上来
大家调试下就知道原因了
---华软网友回复---
问题解决了,因为排序算法有一个冲突,和CString没关系,谢谢各位      
华软声明:本内容来自网络,如有侵犯您版权请来信指出,本站立即删除。