std::vector push_back操作引发的内存访问冲突

anuosix 2009-04-25 01:45:25
struct_WF tmpStructWinF;
struct_F tmpFeature;
tmpStructWinF.iWinNum=iWin;
tmpStructWinF.bIsInclude=true;
tmpStructWinF.fWFPb=0.0;
tmpStructWinF.fWFPg=0.0;
tmpStructWinF.iWTtlDocNum=iTtlDocNum;
tmpStructWinF.vtrWFDocs.insert(strUrl);
tmpStructWinF.iWFDocNum=tmpStructWinF.vtrWFDocs.size();
tmpFeature.strFName=strFeature;
tmpFeature.vtrWF.push_back(tmpStructWinF);

这段代码,引发的内存访问冲突
两个结构体定义如下:
struct struct_WF
{
size_t iWinNum;
bool bIsInclude;
size_t iWFDocNum;
size_t iWTtlDocNum;
float fWFPb;
float fWFPg;
std::set<std::string> vtrWFDocs;
//tVtrBFWithAvgNum vtrBFAvgNum;
//std::set<int> vtrFNumInDocs;
bool operator==(const struct_WF &b)const
{
bool bIsEqual=false;
if(iWinNum==b.iWinNum&&bIsInclude==b.bIsInclude&&iWFDocNum==b.iWFDocNum&&iWTtlDocNum==b.iWTtlDocNum&&abs(fWFPb-b.fWFPb)<0.00000100&&abs(fWFPg-b.fWFPg)<0.00000100&&vtrWFDocs==b.vtrWFDocs)
{
bIsEqual=true;
}
return bIsEqual;
}

};
struct struct_F
{
std::string strFName;
std::vector<struct_WF> vtrWF;
bool operator==(const struct_F &b) const
{
bool bIsEqual=false;
if (strFName==b.strFName&&vtrWF==b.vtrWF)
{
bIsEqual=true;
}
return bIsEqual;
}
};

原因不明,原来可以运行,现在出了这个问题,不知道为什么
出错信息如下:
exptBlog.exe 中的 0x7c94a958 处未处理的异常: 0xC0000005: 写入位置 0x00030fa8 时发生访问冲突

出错的语句在代码的tmpFeature.vtrWF.push_back(tmpStructWinF);这一句
...全文
1091 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
yshuise 2009-04-26
  • 打赏
  • 举报
回复
很可能没有写复制构造函数的原因,因为vector是值语义。编译器合成的出现了错误。
liubuweiright 2009-04-25
  • 打赏
  • 举报
回复
顶楼主...

学习.
anuosix 2009-04-25
  • 打赏
  • 举报
回复
就这段代码本身来讲,没有改什么东西,可能别的地方有改动,现在也不知道是哪里,也不知道如何才能找到源头了
莫名其妙,而且在运行的 时候,跟踪到的数据也没有空,都有数据的,就是这个 push_back这里出问题
hiboys 2009-04-25
  • 打赏
  • 举报
回复
你的问题是两个结构占空间不一样大造成的。
一般是你push进去的对象比声明时的类型占空间要大。
  • 打赏
  • 举报
回复
原因不明,原来可以运行,现在出了这个问题,不知道为什么
出错信息如下:
exptBlog.exe 中的 0x7c94a958 处未处理的异常: 0xC0000005: 写入位置 0x00030fa8 时发生访问冲突

出错的语句在代码的tmpFeature.vtrWF.push_back(tmpStructWinF);这一句

你改了什么没有?单独运行没问题啊
lingyin55 2009-04-25
  • 打赏
  • 举报
回复
是不是你在其它的地方占用或者修改了这里的内存。

[Quote=引用楼主 anuosix 的帖子:]
C/C++ codestruct_WF tmpStructWinF;
struct_F tmpFeature;
tmpStructWinF.iWinNum=iWin;
tmpStructWinF.bIsInclude=true;
tmpStructWinF.fWFPb=0.0;
tmpStructWinF.fWFPg=0.0;
tmpStructWinF.iWTtlDocNum=iTtlDocNum;
tmpStructWinF.vtrWFDocs.insert(strUrl);
tmpStructWinF.iWFDocNum=tmpStructWinF.vtrWFDocs.si…
[/Quote]
hiboys 2009-04-25
  • 打赏
  • 举报
回复
...abs(fWFPb-b.fWFPb)<0.00000100...
为什么不用double
这个常数总是不让人放心的代码。这里有移植问题。

operator==函数写的有点别扭。你未试图捕获任何错误,何不一个return 搞定
liliangbao 2009-04-25
  • 打赏
  • 举报
回复
帮顶~
mengde007 2009-04-25
  • 打赏
  • 举报
回复

#include <iostream>
#include <string>
#include <set>
#include <vector>
using namespace std;

struct struct_WF
{
size_t iWinNum;
bool bIsInclude;
size_t iWFDocNum;
size_t iWTtlDocNum;
float fWFPb;
float fWFPg;
std::set<std::string> vtrWFDocs;
bool operator==(const struct_WF &b)const
{
bool bIsEqual=false;
if(iWinNum==b.iWinNum&&bIsInclude==b.bIsInclude&&iWFDocNum==b.iWFDocNum&&iWTtlDocNum==b.iWTtlDocNum&&abs(fWFPb-b.fWFPb)<0.00000100&&abs(fWFPg-b.fWFPg)<0.00000100&&vtrWFDocs==b.vtrWFDocs)
{
bIsEqual=true;
}
return bIsEqual;
}

};

struct struct_F
{
std::string strFName;
std::vector<struct_WF> vtrWF;
bool operator==(const struct_F &b) const
{
bool bIsEqual=false;
if (strFName==b.strFName&&vtrWF==b.vtrWF)
{
bIsEqual=true;
}
return bIsEqual;
}
};

int main()
{
struct_WF tmpStructWinF;
string strUrl="afd";
string strFeature="sdf";
struct_F tmpFeature;
tmpStructWinF.iWinNum=6;
tmpStructWinF.bIsInclude=true;
tmpStructWinF.fWFPb=0.0;
tmpStructWinF.fWFPg=0.0;
tmpStructWinF.iWTtlDocNum=4;
tmpStructWinF.vtrWFDocs.insert(strUrl);
tmpStructWinF.iWFDocNum=tmpStructWinF.vtrWFDocs.size();
tmpFeature.strFName=strFeature;
tmpFeature.vtrWF.push_back(tmpStructWinF);

return 0;
}

vs2005下面没有问题;
zhh157 2009-04-25
  • 打赏
  • 举报
回复
原来可以运行,现在出问题,那改了什么地方?
就这段代码来看,没发现什么问题

最好提供一些更有价值的信息

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧