关于动态指针(C语言)

hnjiangxd 2002-01-20 06:43:11
一个全局的指针.
在一个函数a的开头申请空间,结尾释放.
好像没什么问题.
但是不幸的是此函数调用了另一个函数b,b函数也给这个指针申请了空间,并在结束的时候释放.
请高手讲解一下可能出现的后果--主要讲讲原因,谢谢.
...全文
121 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
ssyqcwj 2002-01-22
  • 打赏
  • 举报
回复
二次申请造成内存浪费。在b中申请与释放没有错误但是返回a中时因为在B中申请的内存已经释放而你在A中又释放一次这就造成了释放不存在的内存了后里是造成系统崩溃。
tpProgramer 2002-01-21
  • 打赏
  • 举报
回复
tigermount(智者爱山,仁者爱水) :

你象下面这样写是不是有些问题?
void a()
{
int *p=new int;
b();
delete []p;
}

这个时候,因为b函数中重新给p分配了空间,所以 p的指向已经变了,而且已经在b函数中释放,所以当b函数返回时,p其实已经是释放过的指针了。你可以这样修改你的程序:

void a()
{
int *p=new int;
int *q =p
b();
delete q; //此处不能使用 delete [], 因为你new的形式和delete的形式要一致!
}
不过,我上面的程序也有地方要修改,修改如下:
全局:
long *p=NULL;
在a中:
if(p)
{
delete p;
p = NULL; //新加上的!!
}
p = new long;
在b中:
if(p)
{
delete p;
p = NULL; //新加上的!!
}
p = new p;

tpProgramer 2002-01-21
  • 打赏
  • 举报
回复
这个不能一概而论;
对全局指针,有一些特殊地地方,不如可以赋初值;
于是,是否有内存泄漏就跟每个人的程序书写有关了:

全局:
long *p=NULL;
在a中:
if(p)
delete p;
p = new long;
在b中:
if(p)
delete p;
p = new p;
这样,不论a和b谁先调用,都不会造成内存泄漏。因为new 和delete成对出现


tigermount 2002-01-20
  • 打赏
  • 举报
回复
我认为此中情况不是很常见,例如:
void b();
void a()
{
int *p=new int;
b();
delete []p;
}
void b()
{
int *p=new int;
....
delete [] p;
}
所以b所申请的空间已经释放。



bugbugbug 2002-01-20
  • 打赏
  • 举报
回复
设全局指针为p
在a中:
p=new yourmemorya;后p就指向了你新建的yourmomorya对象,这个对象需要一定的存储空间。
在b中:
p = new yourmemoryb;后你就无法找到yourmemorya对象了,因为指向它的指针已被你重新互致了,这造成了内存泄漏。
如果你在程序中大量的调用a, 这可能会造成程序执行速度变慢。。。。。。

Francky 2002-01-20
  • 打赏
  • 举报
回复
在b函数中给全局指针,赋值。此时在a中早请的内存,你就没法获取它的地址了。这样程序只有退出时,这块内存才会被系统回收。如果这个程序运行时间长点的话,系统内存会不够,程序有可能会 coredump ,这就所谓的内存泄漏。
hnjiangxd 2002-01-20
  • 打赏
  • 举报
回复
谢谢,结果我也知道.
想知道具体的过程--呵呵,越详细越好.
birdinfly 2002-01-20
  • 打赏
  • 举报
回复
同意楼上
hello_wyq 2002-01-20
  • 打赏
  • 举报
回复
内存泄漏和程序有可能crack掉!

15,446

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 非技术区
社区管理员
  • 非技术区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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