set的insert操作内存错误,用valgrind检查了一下

白马依然 2019-04-25 11:31:32
==108666== Conditional jump or move depends on uninitialised value(s)
==108666== at 0x409595: _M_insert_unique (stl_tree.h:1171)
==108666== by 0x409595: std::set<int, std::less<int>, std::allocator<int> >::insert(int const&) (stl_set.h:411)
==108666== by 0x413AF8: partition(HYBRID_MESH&, HYBRID_MESH*, int, int, int, int) (refinefunctions.cpp:202)
==108666== by 0x408C63: main (main.cpp:252)
==108666==
==108666== Invalid read of size 4
==108666== at 0x409588: _M_insert_unique (stl_tree.h:1170)
==108666== by 0x409588: std::set<int, std::less<int>, std::allocator<int> >::insert(int const&) (stl_set.h:411)
==108666== by 0x413AF8: partition(HYBRID_MESH&, HYBRID_MESH*, int, int, int, int) (refinefunctions.cpp:202)
==108666== by 0x408C63: main (main.cpp:252)
==108666== Address 0x544f4f524c4b4d20 is not stack'd, malloc'd or (recently) free'd
==108666==
==108666==
==108666== Process terminating with default action of signal 2 (SIGINT)
==108666== at 0x4F3FA65: catchit (in /usr/sw-cluster/mpi2/lib/libmpi.so.12.0.5)
==108666== by 0x3BA7C0F7DF: ??? (in /lib64/libpthread-2.12.so)
==108666== by 0x409587: _M_insert_unique (stl_tree.h:1170)
==108666== by 0x409587: std::set<int, std::less<int>, std::allocator<int> >::insert(int const&) (stl_set.h:411)
==108666== by 0x413AF8: partition(HYBRID_MESH&, HYBRID_MESH*, int, int, int, int) (refinefunctions.cpp:202)
==108666== by 0x408C63: main (main.cpp:252)

这是其中一部分的错误log,不是很明白为什么insert int变量会出现这种错误。
...全文
204 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
tongshou 2019-04-25
  • 打赏
  • 举报
回复
可能是insert 后 对该句子影响 (mesh.NumTris ?)

for(int i=0;i<mesh.NumTris;++i){

然后。。。。
白马依然 2019-04-25
  • 打赏
  • 举报
回复
for(int i=0;i<mesh.NumTris;++i){
if(face_patch[i]!=-1)
{
gbsolid.face_G[face_patch[i]].facets.insert(i);
}
subject_table[i]=face_patch[i];
}
出问题的这段代码太简单了。
@风轻云淡_ 2019-04-25
  • 打赏
  • 举报
回复
我觉的你贴上相关代码可能会更有用.
zgl7903 2019-04-25
  • 打赏
  • 举报
回复
访问之前判断一下范围 if(face_patch[i]!=-1 && face_patch[i] >= 0 && face_patch[i] < gbsolid.face_G.max_size() && 1)
@风轻云淡_ 2019-04-25
  • 打赏
  • 举报
回复
看看能不能调试一下,看起来不像是这里出的问题.
tongshou 2019-04-25
  • 打赏
  • 举报
回复
set<int> a; a.insert(1)
这个没有问题,但是可以引爆问题,也就是其他地方的非法内存操作时没有马上爆发。
这类问题很头疼,甚至有可能问题不是出在整个函数里,而是程序其他地方出现问题。所以你要把查错范围扩大。
请注意,对 set,vector等操作使用的 iterator类型的数据 随时都有可能失效,
636f6c696e 2019-04-25
  • 打赏
  • 举报
回复
栈内存函数调用后可是会释放的
引用 5 楼 白马依然 的回复:
我检查过了数组没有越界,测试了一下结果也很奇怪,在这个函数里进行哪怕是最简单的set<int> a; a.insert(1)操作都会报错,但是只要不在这个函数里就正常。
白马依然 2019-04-25
  • 打赏
  • 举报
回复
我检查过了数组没有越界,测试了一下结果也很奇怪,在这个函数里进行哪怕是最简单的set<int> a; a.insert(1)操作都会报错,但是只要不在这个函数里就正常。
@风轻云淡_ 2019-04-25
  • 打赏
  • 举报
回复
是不是这个家伙越界了face_patch[i]

64,685

社区成员

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

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