分页: 1 / 1

动态内存的分配与释放

发表于 : 2009-05-06 16:01
weihua2008
我问个问题
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;
}
这样作的话有没有不妥之处各位指点指点
想知道这样做有没有原则性的错误,不会出现内存泄露吧?

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

发表于 : 2009-05-06 22:24
kwarph
很明显,不要在函数体内释放函数外部定义的指针,因为函数无法确定参数指针的内存分配方式,指针不一定都是new动态分配的。

如:

代码: 全选

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

另外,我有点困惑,我看了你的几个帖子,不明白你为什么总把C++当C使?

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

发表于 : 2009-05-07 11:26
weihua2008
你真是一语中的,我学过c,c++是自己学的,到现在还是掌握的不熟练
这你说对了,
但是,开始的假设我已经确定了所有释放的都是 new []出来的
这样的话,有没有疏漏之处?

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

发表于 : 2009-05-07 11:32
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,该在那个函数中释放??
这样些的程序是不是有不妥之处,望指教

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

发表于 : 2009-05-07 11:44
peachcolor
一般来说在哪个scope创建就在哪个scope释放吧

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

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

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

发表于 : 2009-05-07 13:54
weihua2008
kwarph,
你举的例子当然不用delete掉,我的p是new char[12];
的当然要delete掉,不是吗?
我还是那句话,delete的时候我是确定是new 出来的,

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

发表于 : 2009-05-09 20:36
BigSnake.NET
weihua2008 写了:kwarph,
你举的例子当然不用delete掉,我的p是new char[12];
的当然要delete掉,不是吗?
我还是那句话,delete的时候我是确定是new 出来的,
dummy 不知道 ar 是不是 new 出来的

dummy 多了,你也不知道了

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

发表于 : 2009-05-09 20:37
BigSnake.NET
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 那行

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

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

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

发表于 : 2009-05-11 9:06
weihua2008
谢谢 ,楼上各位

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

发表于 : 2009-05-11 13:45
zigzed
原则问题:谁分配谁释放。。。。。。。。。