当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 12 篇帖子 ] 
作者 内容
1 楼 
 文章标题 : 动态内存的分配与释放
帖子发表于 : 2009-05-06 16:01 

注册: 2008-07-10 15:08
帖子: 448
送出感谢: 0 次
接收感谢: 0 次
我问个问题
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;
}
这样作的话有没有不妥之处各位指点指点
想知道这样做有没有原则性的错误,不会出现内存泄露吧?


页首
 用户资料  
 
2 楼 
 文章标题 : Re: 动态内存的分配与释放
帖子发表于 : 2009-05-06 22:24 
头像

注册: 2006-06-19 19:19
帖子: 51
送出感谢: 0 次
接收感谢: 0 次
很明显,不要在函数体内释放函数外部定义的指针,因为函数无法确定参数指针的内存分配方式,指针不一定都是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


页首
 用户资料  
 
3 楼 
 文章标题 : Re: 动态内存的分配与释放
帖子发表于 : 2009-05-07 11:26 

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


页首
 用户资料  
 
4 楼 
 文章标题 : Re: 动态内存的分配与释放
帖子发表于 : 2009-05-07 11:32 

注册: 2008-07-10 15:08
帖子: 448
送出感谢: 0 次
接收感谢: 0 次
还是想问内存释放的问题
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,该在那个函数中释放??
这样些的程序是不是有不妥之处,望指教


页首
 用户资料  
 
5 楼 
 文章标题 : Re: 动态内存的分配与释放
帖子发表于 : 2009-05-07 11:44 
头像

注册: 2006-05-20 14:03
帖子: 898
送出感谢: 0 次
接收感谢: 0 次
一般来说在哪个scope创建就在哪个scope释放吧


页首
 用户资料  
 
6 楼 
 文章标题 : Re: 动态内存的分配与释放
帖子发表于 : 2009-05-07 13:50 

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


页首
 用户资料  
 
7 楼 
 文章标题 : Re: 动态内存的分配与释放
帖子发表于 : 2009-05-07 13:54 

注册: 2008-07-10 15:08
帖子: 448
送出感谢: 0 次
接收感谢: 0 次
kwarph,
你举的例子当然不用delete掉,我的p是new char[12];
的当然要delete掉,不是吗?
我还是那句话,delete的时候我是确定是new 出来的,


页首
 用户资料  
 
8 楼 
 文章标题 : Re: 动态内存的分配与释放
帖子发表于 : 2009-05-09 20:36 
头像

注册: 2006-07-02 11:16
帖子: 12522
地址: 廣州
送出感谢: 0 次
接收感谢: 8
weihua2008 写道:
kwarph,
你举的例子当然不用delete掉,我的p是new char[12];
的当然要delete掉,不是吗?
我还是那句话,delete的时候我是确定是new 出来的,


dummy 不知道 ar 是不是 new 出来的

dummy 多了,你也不知道了


_________________
^_^ ~~~
要理解递归,首先要理解递归。

地球人都知道,理论上,理论跟实际是没有差别的,但实际上,理论跟实际的差别是相当大滴。


页首
 用户资料  
 
9 楼 
 文章标题 : Re: 动态内存的分配与释放
帖子发表于 : 2009-05-09 20:37 
头像

注册: 2006-07-02 11:16
帖子: 12522
地址: 廣州
送出感谢: 0 次
接收感谢: 8
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 那行


_________________
^_^ ~~~
要理解递归,首先要理解递归。

地球人都知道,理论上,理论跟实际是没有差别的,但实际上,理论跟实际的差别是相当大滴。


页首
 用户资料  
 
10 楼 
 文章标题 : Re: 动态内存的分配与释放
帖子发表于 : 2009-05-10 1:51 
头像

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


_________________
My blog: hsquared66.blogspot.com


页首
 用户资料  
 
11 楼 
 文章标题 : Re: 动态内存的分配与释放
帖子发表于 : 2009-05-11 9:06 

注册: 2008-07-10 15:08
帖子: 448
送出感谢: 0 次
接收感谢: 0 次
谢谢 ,楼上各位


页首
 用户资料  
 
12 楼 
 文章标题 : Re: 动态内存的分配与释放
帖子发表于 : 2009-05-11 13:45 

注册: 2006-02-27 10:32
帖子: 267
送出感谢: 0 次
接收感谢: 0 次
原则问题:谁分配谁释放。。。。。。。。。


页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 12 篇帖子 ] 

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:没有注册用户 和 3 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译