动态内存的分配与释放

软件和网站开发以及相关技术探讨
回复
weihua2008
帖子: 448
注册时间: 2008-07-10 15:08

动态内存的分配与释放

#1

帖子 weihua2008 » 2009-05-06 16:01

我问个问题
func(char * p)
{
cout<<p<<endl;
}
int main()
{
char *p=new char [12];
strcpy(p,"weihua",strlen("weihua"));
func(p);
delete [] p;
return 0;
}
我现在想的是是否可以在func()函数中释放动态分配的 char *p
func(char * p)
{
cout<<p<<endl;
delete [] p;
}
int main()
{
char *p=new char [12];
strcpy(p,"weihua",strlen("weihua"));
func(p);
return 0;
}
这样作的话有没有不妥之处各位指点指点
想知道这样做有没有原则性的错误,不会出现内存泄露吧?
头像
kwarph
帖子: 51
注册时间: 2006-06-19 19:19
联系:

Re: 动态内存的分配与释放

#2

帖子 kwarph » 2009-05-06 22:24

很明显,不要在函数体内释放函数外部定义的指针,因为函数无法确定参数指针的内存分配方式,指针不一定都是new动态分配的。

如:

代码: 全选

void dummy(int* ar);
...
int ar[] = {1, 2, 3, 4};
dummy(ar);
你说在dummy函数内可不可以或说要不要delete[] ar?

另外,我有点困惑,我看了你的几个帖子,不明白你为什么总把C++当C使?
Tiger Cheng
昆山轩辕IT培训中心
C++培训讲师
邮件:kwarph@gmail.com
主页:http://www.xuanyuan-soft.cn
weihua2008
帖子: 448
注册时间: 2008-07-10 15:08

Re: 动态内存的分配与释放

#3

帖子 weihua2008 » 2009-05-07 11:26

你真是一语中的,我学过c,c++是自己学的,到现在还是掌握的不熟练
这你说对了,
但是,开始的假设我已经确定了所有释放的都是 new []出来的
这样的话,有没有疏漏之处?
weihua2008
帖子: 448
注册时间: 2008-07-10 15:08

Re: 动态内存的分配与释放

#4

帖子 weihua2008 » 2009-05-07 11:32

还是想问内存释放的问题
bool BuildPackage(int i)
{
char *p=new char [];
ASend(i,p);
}
bool ASend(int ai ,char *ap)
{
send(ai,ap....);
BuildPackage(i);
}
上面个的两个函数相互嵌套,
我是在ASend中释放的,但是,运行几千次就出现段错误
那我的char *p,该在那个函数中释放??
这样些的程序是不是有不妥之处,望指教
头像
peachcolor
帖子: 898
注册时间: 2006-05-20 14:03

Re: 动态内存的分配与释放

#5

帖子 peachcolor » 2009-05-07 11:44

一般来说在哪个scope创建就在哪个scope释放吧
weihua2008
帖子: 448
注册时间: 2008-07-10 15:08

Re: 动态内存的分配与释放

#6

帖子 weihua2008 » 2009-05-07 13:50

peachcolor, 这个不好吧,我上面的例子中,不一会就会因为我没有及时释放内存就会出现段错误的
你想想是不是,第一个BuildPackage,Asend ,BuildPackage,ASend,。。。。
那么我在第一个BuildPackage中new 的p只有到整个循环完成后才会释放
这样不好 吧
我说的对不对?你考虑一下
weihua2008
帖子: 448
注册时间: 2008-07-10 15:08

Re: 动态内存的分配与释放

#7

帖子 weihua2008 » 2009-05-07 13:54

kwarph,
你举的例子当然不用delete掉,我的p是new char[12];
的当然要delete掉,不是吗?
我还是那句话,delete的时候我是确定是new 出来的,
头像
BigSnake.NET
帖子: 12522
注册时间: 2006-07-02 11:16
来自: 廣州
联系:

Re: 动态内存的分配与释放

#8

帖子 BigSnake.NET » 2009-05-09 20:36

weihua2008 写了:kwarph,
你举的例子当然不用delete掉,我的p是new char[12];
的当然要delete掉,不是吗?
我还是那句话,delete的时候我是确定是new 出来的,
dummy 不知道 ar 是不是 new 出来的

dummy 多了,你也不知道了
^_^ ~~~
要理解递归,首先要理解递归。

地球人都知道,理论上,理论跟实际是没有差别的,但实际上,理论跟实际的差别是相当大滴。
头像
BigSnake.NET
帖子: 12522
注册时间: 2006-07-02 11:16
来自: 廣州
联系:

Re: 动态内存的分配与释放

#9

帖子 BigSnake.NET » 2009-05-09 20:37

weihua2008 写了:还是想问内存释放的问题
bool BuildPackage(int i)
{
char *p=new char [];
ASend(i,p);
}
bool ASend(int ai ,char *ap)
{
send(ai,ap....);
BuildPackage(i);
}
上面个的两个函数相互嵌套,
我是在ASend中释放的,但是,运行几千次就出现段错误
那我的char *p,该在那个函数中释放??
这样些的程序是不是有不妥之处,望指教
你这个是递归没有边界,栈爆掉了,实际上两个函数根本就到不了 return 那行
^_^ ~~~
要理解递归,首先要理解递归。

地球人都知道,理论上,理论跟实际是没有差别的,但实际上,理论跟实际的差别是相当大滴。
头像
pollothana
帖子: 262
注册时间: 2007-03-08 10:47

Re: 动态内存的分配与释放

#10

帖子 pollothana » 2009-05-10 1:51

三点:
1.楼上说的有道理,默认栈的大小只有1.2MB左右,而函数调用都是放在栈里的,你这个递归多了肯定是段错误;
2.楼主的方法虽然不推荐,但是算法本身似乎没什么问题,必须在ASend调用BuildPackage之前释放内存才有作用,还有如楼上所说,你的代码段中看不出调用是如何终止的;
3.楼主这样的编程风格,建议还是用C比较好,也没必要用C++。
My blog: hsquared66.blogspot.com
weihua2008
帖子: 448
注册时间: 2008-07-10 15:08

Re: 动态内存的分配与释放

#11

帖子 weihua2008 » 2009-05-11 9:06

谢谢 ,楼上各位
zigzed
帖子: 267
注册时间: 2006-02-27 10:32

Re: 动态内存的分配与释放

#12

帖子 zigzed » 2009-05-11 13:45

原则问题:谁分配谁释放。。。。。。。。。
回复