STL MAP 插入数据时报 Segmentation fault,请大虾帮忙看看哈,多谢了!

loudiaohua 2009-08-26 10:49:55
void CNewBusi::ReadQuetions()
{
char curYM[20] = {0};
getnow(curYM, sizeof(curYM), "%Y-%m"); //获取当前时间,年月

quetion_stru quetion; //临时
int quetionNumber = 0; //题目数目

//获取当月的题目
rec.close();
rec.sqlstr = "SELECT * FROM qzzswd_quetions WHERE use_month = ? AND checked_flag = 1";
rec.append_param(curYM);

if (!rec.open())
{
rec.close();
log_err("调用rec.open()出错");
exit(1);
}

quetions.clear();
while (!rec.eof)
{
//将每个题目放入quetions中
bzero(&quetion, sizeof(quetion));
quetion.cur_sequence = atoi(rec.get("cur_sequence"));
strcpy(quetion.quetion, rec.get("quetion"));
strcpy(quetion.right_answer, rec.get("right_answer"));

quetions.insert(pair<int const, quetion_stru>(quetion.cur_sequence, quetion)); //如果有这句话则报错,否则正常
quetionNumber++;

rec.move_next();
}
rec.close();

if (QUETION_NUMBER != quetionNumber)
{
log_not("提取的题目数量错误: [%d]", quetionNumber);
}
}

备注:
struct quetion_stru
{
int cur_sequence; //题号
char quetion[151]; //题目
char right_answer[6]; //正确答案
};

map<int, quetion_stru> quetions;
...全文
627 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
erwin1984 2009-08-26
  • 打赏
  • 举报
回复
估计是别的操作把 quetions 对象破坏了,你仔细检查内存复制、等操作的地方,是否存在缓冲区溢出的可能性?
loudiaohua 2009-08-26
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 erwin1984 的回复:]
直接调试原来的代码,设置断点?如果报错,看看具体的上下文就明白了吧。
[/Quote]

(gdb) n
346 while (!rec.eof)
(gdb)
349 bzero(&quetion, sizeof(quetion));
(gdb)
350 quetion.cur_sequence = atoi(rec.get("cur_sequence"));
(gdb)
351 strcpy(quetion.quetion, rec.get("quetion"));
(gdb)
352 strcpy(quetion.right_answer, rec.get("right_answer"));
(gdb)
354 quetions.insert(pair<int const, quetion_stru>(quetion.cur_sequence, quetion));
(gdb) print quetion.cur_sequence
$1 = 1
(gdb) print quetion.right_answer
$2 = "A\000\000\000\000"
(gdb) n

Program received signal SIGSEGV, Segmentation fault.
0x08051d36 in std::_Rb_tree<int, std::pair<int const, quetion_stru>, std::_Select1st<std::pair<int const, quetion_stru> >, std::less<int>, std::allocator<std::pair<int const, quetion_stru> > >::insert_unique(std::pair<int const, quetion_stru> const&) (this=0x412c72bc,
__v=@0xbfffd450) at stl_tree.h:1037
1037 _Link_type __x = _M_root();
(gdb)

也许不是insert的错?
erwin1984 2009-08-26
  • 打赏
  • 举报
回复
直接调试原来的代码,设置断点?如果报错,看看具体的上下文就明白了吧。
loudiaohua 2009-08-26
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 taodm 的回复:]
把这句话单独拉出来测试呗。
[/Quote]

#include <map>
#include <iostream>

using namespace std;

struct quetion_stru
{
int cur_sequence; //题号
char quetion[151]; //题目
char right_answer[6]; //正确答案
};

int main(int argc, char *argv[])
{
map<int, quetion_stru> quetions;
quetion_stru quetion;

quetions.clear();

bzero(&quetion, sizeof(quetion));
quetion.cur_sequence = 1;
strcpy(quetion.quetion, "sample1");
strcpy(quetion.right_answer, "A");

quetions.insert(pair<int const, quetion_stru>(quetion.cur_sequence, quetion));

bzero(&quetion, sizeof(quetion));
quetion.cur_sequence = 2;
strcpy(quetion.quetion, "sample2");
strcpy(quetion.right_answer, "B");

quetions.insert(pair<int const, quetion_stru>(quetion.cur_sequence, quetion));

exit(0);
}


单独拉出来好像又没有问题,呵呵,头大啊
taodm 2009-08-26
  • 打赏
  • 举报
回复
把这句话单独拉出来测试呗。
loudiaohua 2009-08-26
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 erwin1984 的回复:]
估计是别的操作把 quetions 对象破坏了,你仔细检查内存复制、等操作的地方,是否存在缓冲区溢出的可能性?
[/Quote]


多谢了,根据你的指导,是构造函数中做的操作bzero(&quetions, sizeof(quetions));造成的

65,208

社区成员

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

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