作者HateAnus (讨厌从後面来)
看板C_and_CPP
标题[问题] new一个新物件会当掉(更新抓到问题)
时间Mon Apr 16 23:45:01 2018
开发平台(Platform): (Ex: Win10, Linux, ...)
Dev cpp
编译器(Ex: GCC, clang, VC++...)+目标环境(跟开发平台不同的话需列出)
TDM-GCC
额外使用到的函数库(Library Used): (Ex: OpenGL, ...)
问题(Question):
// ---------------------抓到一个问题---------------------
1.
http://codepad.org/AIL3PuH3 这样正确输出
2.
http://codepad.org/5Q0nw7x6 这样会当
Why?
下面还有补充一个
// ---------------------抓到一个问题---------------------
Token * tk = new Token ;
这一行我下方有特地加cout << "123" << endl;之类的
发现是这行会当掉
Why? 没几个token为什麽会当?
喂入的资料(Input):
hello world
goodbye world
预期的正确结果(Expected Output):
hello
world
goodbye
world
错误结果(Wrong Output):
hello
world
正常输出
接着第二轮输入:
当掉
用CodeBlock正常输出几个後 有跳出疑似记忆体不足的错误
用Dev cpp则是在正常输出没几个後就当机
例如
ha
ha
当掉
程式码(Code):(请善用置底文网页, 记得排版,禁止使用图档)
http://codepad.org/TJMohrCQ
// -------------------------------------------------------
抓到一个问题了
里面的gFront(也就是Linked List的头)
居然会被改动?
我不是打了if ( gFront == NULL )才动gFront吗
怎麽会这样?
// -------------------------------------------------------
补充说明(Supplement):
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 220.137.112.191
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1523893504.A.D32.html
1F:→ djshen: 13行确定会跳出? 04/16 23:49
抱歉程式码没给得很详细 但我这边的会跳出
主要是要问 为什麽NEW一个物件会当 而且才NEW没几个
※ 编辑: HateAnus (220.137.112.191), 04/16/2018 23:53:40
2F:→ crazycy: delete? 04/16 23:54
3F:→ crazycy: 喔 没事 当我没说 04/16 23:55
4F:→ djshen: code不详细错误讯息也不详细不如掷筊 04/16 23:58
5F:→ djshen: 你可以用debugger 04/16 23:59
6F:推 flyfoxy: sInput[i+1]越界,当下没当,而是当在後面奇怪的地方 04/17 00:00
7F:推 asilzheng: 与一楼有相同的疑问,觉得13行没跳出造成Str1违规存取 04/17 00:33
8F:→ shadow0326: 就是sInput[i+1]的锅吧 04/17 00:46
刚刚改成 if ( i > 0 ) if ( sInput[i] == '/' && sInput[i-1] == '/' )
还是会当掉说
注解掉也是当掉QQ
※ 编辑: HateAnus (220.137.112.191), 04/17/2018 01:16:03
9F:推 asilzheng: Str100的型别是什麽?我猜是char[100],而且Str1没给 04/17 01:54
10F:→ asilzheng: 结束字元,造成strcpy复制过多而出错 04/17 01:54
11F:推 ilikekotomi: 全部code传github比较有帮助 这样才知道Str100做什麽 04/17 01:57
12F:推 asilzheng: 这段程式有多处会造成违规存取,没修好死在奇怪的地方 04/17 01:57
13F:→ asilzheng: 都不意外 04/17 01:57
14F:→ asilzheng: 猜测13行的检查在没有空白的时候,会越过结束字元,回 04/17 02:24
15F:→ asilzheng: 圈停不下来且造成记忆体破坏,刚好结束回圈後是new,才 04/17 02:24
16F:→ asilzheng: 误以为是new出问题 04/17 02:24
17F:→ joe820730: 这没把完整程式码上传跟掷筊差不多... 04/17 09:22
18F:→ hunandy14: 实际上被你隐藏起来的地方是有关连的 04/17 14:36
19F:→ hunandy14: 如果真的要隐藏,可以开一个单档最小化重现bug 04/17 14:38
20F:→ hunandy14: 把你觉得重要的地方砍一砍保留会错误的部分砍到最简 04/17 14:38
不好意思 我更新了完整程式码 再麻烦各位看一下
这次一样当在New Token
好像固定当在第四个token
22F:→ rbufghj9713: struct的你有做typedef吗?不知道没做会不会有问题 04/18 01:02
我试试看 .. 好像不影响
23F:→ djshen: strcpy要copy到哪去? 04/18 01:08
先用temp存getline里的各个字 例如 hello world 就存 hello 和world
接着把temp copy到token的tokenstr里面
24F:→ djshen: 我知道你想干嘛 但你知道你要copy去哪? 04/18 01:20
就放到Token中 然後token做成Linked List这样 ... 是我把strcpy弄错了吗
25F:→ djshen: 所以你发现Str100和CharPtr不一样了 04/18 10:24
不好意思 我真的不知道你在说什麽
Char array和Char Pointer在这个Case应该是不影响当不当机吧
※ 编辑: HateAnus (114.37.84.98), 04/18/2018 12:49:32
26F:→ loveflames: 就是因为这个才当机 04/18 13:29
27F:→ djshen: 你觉得char*会指到哪里 04/18 13:38
28F:→ hunandy14: 64行补 tk->tokenStr = new char[strlen(temp)]; 04/18 17:08
29F:→ hunandy14: 更正 还要+1, 这样应该可以理解了吧QuQ 自己找地方del 04/18 17:11
30F:→ hunandy14: 行数我有砍到 是78 04/18 17:16
31F:推 ilikekotomi: 因为CharPtr没有分配空间 所以才会当机 04/18 21:20
32F:→ joe820730: char array在编译期就配好记忆体,当然不会出错 04/19 21:33
33F:→ joe820730: 而char pointer如果你没有new或malloc一个空间给它, 04/19 21:35
34F:→ joe820730: 你根本不知道它会指到哪,当机也就理所当然了 04/19 21:36
35F:推 dzwei: 楼上正解, 04/21 03:31