作者rexkou (脆瓜)
看板C_and_CPP
标题[问题] 同时使用两个Class会导致Crash吗?
时间Wed Sep 13 02:00:42 2017
开发平台(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()只是把上面的功能包进去而已
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 59.115.102.105
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1505239245.A.86F.html
1F:推 VictorTom: VC2015 release build跑完会出error code c0000374. 09/13 02:41
2F:→ VictorTom: aka. Heap Corruption. 09/13 02:42
3F:→ VictorTom: Debugger挂起来看, 第一个档案fr.line_cnt=2416 09/13 02:43
4F:→ VictorTom: 但程式走到Line 162 for(i...)的时候, s_cnt=2417 09/13 02:45
5F:→ VictorTom: 剩下的给你自己解迷吧:) 09/13 02:48
6F:→ VictorTom: PS. 有时是c0000005 AV; 不影响root cause就是.... 09/13 02:51
7F:推 stucode: 推 VT 大。偷偷给个提示:Heap Corruption 类发生错误 09/13 08:13
8F:→ stucode: 跟造成问题的不一定是同一个地方。然後要是改用 09/13 08:13
9F:→ stucode: std::vector 就可以在 debug 模式下抓出真正问题点。 09/13 08:14
谢谢两位,知道引发错误的地方在哪里了
就是很单纯的违规存取 (昏
下意识的认为fr.line_cnt一定会大於s_cnt了...
想请问两位是怎麽发现的?
当发现错误的当下又是从哪边去找出问题点的呢?
另外,还想顺便请问一下
除了使用vector,有什麽方式可以在程式中帮助判断是不是违规存取吗?
10F:推 johnpage: 请改不同档名! 09/13 12:02
不同档名的意思是?
※ 编辑: rexkou (140.124.73.163), 09/13/2017 12:29:30
※ 编辑: rexkou (140.124.73.163), 09/13/2017 13:00:36
※ 编辑: rexkou (140.124.73.163), 09/13/2017 13:03:17
11F:推 stucode: 说实话我是看了 VT 大的推文以後,很快就找到违规存取 09/13 18:15
12F:→ stucode: 的地方。从头找起的话,用单步执行逐项检查初始化、 09/13 18:15
13F:→ stucode: 动态配置、存取边界、指标复制及赋值和档案存取等。 09/13 18:15
14F:→ stucode: 或者是下条件断点在觉得有可能会越界的地方。 09/13 18:15
15F:→ stucode: 除此之外也可以借助一下记忆体侦错工具的力量: 09/13 18:16
谢谢~
咦好厉害啊,这是Ubuntu吧?
想请问是用什麽开发软体来弄记忆体侦错的呢?
※ 编辑: rexkou (140.124.73.163), 09/13/2017 21:31:27
17F:推 Killercat: Valgrind啊 其实他贴的图就有写了 09/13 23:46
18F:→ Killercat: 这东西连memory leak都有办法抓到一大半 很猛的 09/13 23:46
19F:推 VictorTom: 其实我也是code看了一轮看不出来才上debugger抓看看的, 09/14 00:16
20F:→ VictorTom: 因为是Heap Corrupt, 所以要来的array特别留意了一下. 09/14 00:17
21F:→ VictorTom: 其实这种靠debugger硬干heap issue也不是什麽好方法, 09/14 00:18
22F:→ VictorTom: 像s大那样用正规工具抓memory issue才是比较好的方法:) 09/14 00:19
23F:推 stucode: 工具是 Valgrind 没错。 09/14 14:12