[问题] 同时使用两个Class会导致Crash吗?

楼主: rexkou (脆瓜)   2017-09-13 02:00:42
开发平台(Platform): (Ex: Win10, Linux, ...)
Win7 SP1 x64
编译器(Ex: GCC, clang, VC++...)+目标环境(跟开发平台不同的话需列出)
1. Code::Blocks 16.01 (直接Crash掉)
2. Visual Studio 2017 (Debug Mode可顺利执行)
问题(Question):
自己以前用C写了一个读档的程式
会读取txt档之后把换行隔开,分别存到阵列里面。
后来因为要在C++用,把它包成Class之后
才发现一开始的设计好像有问题。
Case 1. 当单独使用一个Class时,程式都不会有问题(如下图)。
https://i.imgur.com/ldx36YH.png
Case 2. 当两个Class并存时,编译可过,但执行会Crash掉(如下图)。
https://i.imgur.com/YkkbyFk.png
有使用动态内存分配,不过想说也没用多少所以没free掉。
虽然C++已经有很完善的功能可以完成这些功能,
但私心还是想找出问题点在哪里,
想请各位高手帮忙看看是哪里疏忽了。
喂入的资料(Input):
任意txt档,不要一次换两行以上的都可以。
(可参照程式码附件)
预期的正确结果(Expected Output):
正确读取txt档,不会crash掉(如下图)。
https://i.imgur.com/VLWuIfz.png
错误结果(Wrong Output):
就是程式crash掉(如下图)。
https://i.imgur.com/riBeaY3.png
目前在Visual Studio 2017的Debug Mode(x86/64)可以顺利执行
在Release Mode(x64)版本偶有crash,(x86)版本及Code::Block则固定会crash。
程式码(Code):(请善用置底文网页, 记得排版)
一个使用置底文网页,
一个则是将主程式及使用的txt档一并上传Dropbox
1. https://ideone.com/qOIASO (置抵文网页)
2. https://goo.gl/hgPWKz (包含使用的文字档跟主程式)
补充说明(Supplement):
其实做了一整天的测试之后,
推测是里面一个名为readPath()的副程式也有问题。
这样执行多次的话,程式也会crash掉,状况与之前上面描述的很相似
https://i.imgur.com/6TzSLX0.png
自己觉得是内存配置的写法有弄错,还特地把malloc改成new
可是两者在Debug状态都可以跑,下断点也看不出所以然来,只好来求助了。
自己用printf慢慢看
似乎会在readPath()里面的这行出问题
fr.file_name = new char*[fr.line_cnt];
给各位当作参考。
程式主要功能说明:
1. 利用readPath(char* filePath_in)将txt的每行文字,分别储存至ftype的char**
里面
2. fileClass的loadFile()只是把上面的功能包进去而已
作者: VictorTom (鬼翼&娃娃鱼)   2017-09-13 02:41:00
VC2015 release build跑完会出error code c0000374.aka. Heap Corruption.Debugger挂起来看, 第一个档案fr.line_cnt=2416但程式走到Line 162 for(i...)的时候, s_cnt=2417剩下的给你自己解迷吧:)PS. 有时是c0000005 AV; 不影响root cause就是....
作者: stucode   2017-09-13 08:13:00
推 VT 大。偷偷给个提示:Heap Corruption 类发生错误跟造成问题的不一定是同一个地方。然后要是改用std::vector 就可以在 debug 模式下抓出真正问题点。
作者: johnpage (johnpage)   2017-09-13 12:02:00
请改不同档名!
作者: stucode   2017-09-13 18:15:00
说实话我是看了 VT 大的推文以后,很快就找到违规存取的地方。从头找起的话,用单步执行逐项检查初始化、动态配置、存取边界、指标复制及赋值和档案存取等。或者是下条件断点在觉得有可能会越界的地方。除此之外也可以借助一下内存侦错工具的力量:https://i.imgur.com/qG1c75E.png
作者: Killercat (杀人猫™)   2017-09-13 23:46:00
Valgrind啊 其实他贴的图就有写了这东西连memory leak都有办法抓到一大半 很猛的
作者: VictorTom (鬼翼&娃娃鱼)   2017-09-14 00:16:00
其实我也是code看了一轮看不出来才上debugger抓看看的,因为是Heap Corrupt, 所以要来的array特别留意了一下.其实这种靠debugger硬干heap issue也不是什么好方法,像s大那样用正规工具抓memory issue才是比较好的方法:)
作者: stucode   2017-09-14 14:12:00
工具是 Valgrind 没错。

Links booklink

Contact Us: admin [ a t ] ucptt.com