c/c++好多陷阱,越来越感觉确实水深...

田暗星 2010-12-27 09:57:45
void freePtr1(int* p1) //虽然没有正确释放p 确真正释放了内存 再次p操作很危险
{
delete p1;
p1 = NULL;
}

void freePtr2(int*& p2)//完全正确
{
delete p2;
p2 = NULL;
}

void InitPtr1(int *p) //虽然没有为p正确分配内存 但真正分配了内存 多次会暗中耗尽内存 且无法释放而泄漏
{
p = (int *)malloc(100*sizeof(int));
}

void InitPtr2(int *&p)//完全正确
{
p = (int *)malloc(100*sizeof(int));
}
...全文
191 14 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
田暗星 2010-12-27
  • 打赏
  • 举报
回复
哈哈 问题源于 游戏中 每次重新开始一个关卡 内存会泄漏 几百字节......
这是某个人搞的... 很头疼 二分查找中...
  • 打赏
  • 举报
回复
实际使用中没几个人这样去分配内存吧
ww884203 2010-12-27
  • 打赏
  • 举报
回复
我赞成mstlq所说的,这个相当基本,如果你要说精髓在于内存变化,那么我猜测可能你以前是用Java或者Python之类的高层语言的,对于熟练使用C/C++的人来说,着眼于内存的确是基本功
Linux-Torvalds 2010-12-27
  • 打赏
  • 举报
回复
明白了,原来是int *&p,是传指针p的引用。
ww884203 2010-12-27
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 c6u5fyd 的回复:]

引用 6 楼 ww884203 的回复:

也就是你用函数释放的时候,由于指针只是被copy了一次,所以你把函数参数的指针设置为NULL对原先的指针没有影响,所以就有了野指针~~~~也不算很大的陷阱,不过脑袋一晕确实容易忘


野指针不是重点 重点是错误操作幕后的内存变化 这个在游戏中很危险 虽然操作失败感觉没什么 确会耗尽内存 让人头疼确找不到问题....
[/Quote]
我是针对前两个说的,free的问题就是野指针,后面一个malloc的问题就是分配了无法控制的内存。我觉得一般来说浪费一小块内存还不算什么,真正危险的是

Type * p = NULL;
while(p == NULL)
{
InitPtr1(p); //这里的p是传值而不是传引用
}

随手写的,当然一般情况下不会出现这种直接的无限分配的情况,但是有可能会出现,在整个循环中有一句是检查是不是已经分配了内存,如果没有则分配,那样的话N次循环都发现没有分配内存就会耗尽内存
田暗星 2010-12-27
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 ww884203 的回复:]

也就是你用函数释放的时候,由于指针只是被copy了一次,所以你把函数参数的指针设置为NULL对原先的指针没有影响,所以就有了野指针~~~~也不算很大的陷阱,不过脑袋一晕确实容易忘
[/Quote]

野指针不是重点 重点是错误操作幕后的内存变化 这个在游戏中很危险 虽然操作失败感觉没什么 确会耗尽内存 让人头疼确找不到问题....
田暗星 2010-12-27
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 mstlq 的回复:]

这个……
相当基本……
[/Quote]
很基本 重点在于 错误的初始化或释放时 真实的内存变化 貌似很多人没有体会到

今天又回头分析了一番 很有趣...
ww884203 2010-12-27
  • 打赏
  • 举报
回复
也就是你用函数释放的时候,由于指针只是被copy了一次,所以你把函数参数的指针设置为NULL对原先的指针没有影响,所以就有了野指针~~~~也不算很大的陷阱,不过脑袋一晕确实容易忘
hhddzz 2010-12-27
  • 打赏
  • 举报
回复
我还没学到这呢
昨天捣鼓 副作用和顺序点 捣鼓了一下午
mstlq 2010-12-27
  • 打赏
  • 举报
回复
这个……
相当基本……
luciferisnotsatan 2010-12-27
  • 打赏
  • 举报
回复
void InitPtr1(int *p) 这个还是传值,这个p是你调用时传的指针的一个副本。
这就和void fun(int x)这里的x一样。
可以看成 一个是 int类型,另一个是int *类型
Linux-Torvalds 2010-12-27
  • 打赏
  • 举报
回复
void freePtr2(int*& p2)//完全正确
{
delete p2;
p2 = NULL;
}
void InitPtr2(int *&p)//完全正确
{
p = (int *)malloc(100*sizeof(int));
}
这两个看不懂?解释一下。
1. C 语言中的指针和内存泄漏 5 2. C语言难点分析整理 10 3. C语言难点 18 4. C/C++实现冒泡排序算法 32 5. C++中指针和引用的区别 35 6. const char*, char const*, char*const的区别 36 7. C中可变参数函数实现 38 8. C程序内存中组成部分 41 9. C编程拾粹 42 10. C语言中实现数组的动态增长 44 11. C语言中的位运算 46 12. 浮点数的存储格式: 50 13. 位域 58 14. C语言函数二维数组传递方法 64 15. C语言复杂表达式的执行步骤 66 16. C语言字符串函数大全 68 17. C语言宏定义技巧 89 18. C语言实现动态数组 100 19. C语言笔试-运算符和表达式 104 20. C语言编程准则之稳定篇 107 21. C语言编程常见问题分析 108 22. C语言编程易犯毛病集合 112 23. C语言缺陷与陷阱(笔记) 119 24. C语言防止缓冲区溢出方法 126 25. C语言高效编程秘籍 128 26. C运算符优先级口诀 133 27. do/while(0)的妙用 134 28. exit()和return()的区别 140 29. exit子程序终止函数与return的差别 141 30. extern与static存储空间矛盾 145 31. PC-Lint与C\C++代码质量 147 32. spirntf函数使用大全 158 33. 二叉树的数据结构 167 34. 位运算应用口诀和实例 170 35. 内存对齐与ANSI C中struct内存布局 173 36. 冒泡和选择排序实现 180 37. 函数指针数组与返回数组指针的函数 186 38. 右左法则- 复杂指针解析 189 39. 回车和换行的区别 192 40. 堆和堆栈的区别 194 41. 堆和堆栈的区别 198 42. 如何写出专业的C头文件 202 43. 打造最快的Hash表 207 44. 指针与数组学习笔记 222 45. 数组不是指针 224 46. 标准C中字符串分割的方法 228 47. 汉诺塔源码 231 48. 洗牌算法 234 49. 深入理解C语言指针的奥秘 236 50. 游戏外挂的编写原理 254 51. 程序实例分析-为什么会陷入死循环 258 52. 空指针究竟指向了内存的哪个地方 260 53. 算术表达式的计算 265 54. 结构体对齐的具体含义 269 55. 连连看AI算法 274 56. 连连看寻路算法的思路 283 57. 重新认识:指向函数的指针 288 58. 链表的源码 291 59. 高质量的子程序 295 60. 高级C语言程序员测试必过的十六道最佳题目+答案详解 297 61. C语言常见错误 320 62. 超强的指针学习笔记 325 63. 程序员之路──关于代码风格 343 64. 指针、结构体、联合体的安全规范 346 65. C指针讲解 352 66. 关于指向指针的指针 368 67. C/C++ 误区一:void main() 373 68. C/C++ 误区二:fflush(stdin) 376 69. C/C++ 误区三:强制转换 malloc() 的返回值 380 70. C/C++ 误区四:char c = getchar(); 381 71. C/C++ 误区五:检查 new 的返回值 383 72. C 是 C++ 的子集吗? 384 73. C和C++的区别是什么? 387 74. 无条件循环 388 75. 产生随机数的方法 389 76. 顺序表及其操作 390 77. 单链表的实现及其操作 391 78. 双向链表 395 79. 程序员数据结构笔记 399 80. Hashtable和HashMap的区别 408 81. hash 表学习笔记 410 82. C程序设计常用算法源代码 412 83. C语言有头结点链表的经典实现 419 84. C语言惠通面试题 428 85. C语言常用宏定义 450

65,189

社区成员

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

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