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));
}
...全文
187 14 打赏 收藏 转发到动态 举报
写回复
用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));
}
这两个看不懂?解释一下。

64,651

社区成员

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

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