关于C语言函数内部内存分配的几个问题~~
我的工作环境是C而不是C++,所以回答C++的同学抱歉了~~~问题有点复杂,我尽量描述得清楚一点,谢谢:1.对于在函数内部使用malloc进行内存分配,很多地方建议使用a...
我的工作环境是C而不是C++,所以回答C++的同学抱歉了~~~问题有点复杂,我尽量描述得清楚一点,谢谢:
1.对于在函数内部使用malloc进行内存分配,很多地方建议使用assert进行有效性检验。但是assert只在DEBUG模式起作用,如果程序将来的RELEASE版本在运行中出现内存不足等情况导致malloc失败怎么办?所以我想是不是还是保留使用if检验更保险,比如如下的使用方法:
int *p = (int *)malloc(……);
if ( p == NULL ) return 0; // 返回函数调用处
2.malloc函数分配内存失败能否free?这个好像看到有不同的说法,这里希望确认下;
3.如果malloc失败后不能free掉指针,那如果函数中连续多次使用malloc分配内存,在对指针进行有效性检验时就只能够逐个检验指针的有效性,而不能像下面这样:
if( ( p1 == NULL )||( p2 == NULL ) )
{
free(p1);
free(p2);
return 0;
}
应该改为:
if(p1== NULL) return 0;
if(p2 == NULL)
{
free(p1);
p1 = NULL;
return 0;
}
这样的处理可不可以?或者实际中还有什么更好的办法没有??
再次感谢~~~~ 展开
1.对于在函数内部使用malloc进行内存分配,很多地方建议使用assert进行有效性检验。但是assert只在DEBUG模式起作用,如果程序将来的RELEASE版本在运行中出现内存不足等情况导致malloc失败怎么办?所以我想是不是还是保留使用if检验更保险,比如如下的使用方法:
int *p = (int *)malloc(……);
if ( p == NULL ) return 0; // 返回函数调用处
2.malloc函数分配内存失败能否free?这个好像看到有不同的说法,这里希望确认下;
3.如果malloc失败后不能free掉指针,那如果函数中连续多次使用malloc分配内存,在对指针进行有效性检验时就只能够逐个检验指针的有效性,而不能像下面这样:
if( ( p1 == NULL )||( p2 == NULL ) )
{
free(p1);
free(p2);
return 0;
}
应该改为:
if(p1== NULL) return 0;
if(p2 == NULL)
{
free(p1);
p1 = NULL;
return 0;
}
这样的处理可不可以?或者实际中还有什么更好的办法没有??
再次感谢~~~~ 展开
3个回答
2011-06-29
展开全部
1、可以用if代替assert断言。
2、如果空间够,分配就会失败,malloc()会返回一个NULL指针。而free()函数对空指针没有作用(相当于不调用free()函数)
3、如果分配失败,就不用作清理工作(比如调用free()函数)。
2、如果空间够,分配就会失败,malloc()会返回一个NULL指针。而free()函数对空指针没有作用(相当于不调用free()函数)
3、如果分配失败,就不用作清理工作(比如调用free()函数)。
展开全部
1、可以用if代替assert断言:但是malloc在用户空间分配内存几乎不会失败,编程时你应该知道划分多大内存是保险的, 如果你划分的很大很大,即使是用了 if语句执行失败返回那也是失败了,对你程序来说没有任何意义。因为即使你不使用if语句,操作系统也会给你贴出个oops,告诉你你内存泄露了。
所以说,检查malloc成败只在调试阶段有用的。
2, 如果你malloc失败就根本没用告诉操作系统要保留某段内存,那也就根本不用free了。
所以说,检查malloc成败只在调试阶段有用的。
2, 如果你malloc失败就根本没用告诉操作系统要保留某段内存,那也就根本不用free了。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
void getmo(char *p)
{
p=(char*)malloc(10);
int i = 0;
}
void main()
{
char *str;
getmo(str);//传递了一个指针到函数,函数内部不能改变原来的指针本身,只能改变指针指向的内容
//换句话说,getmo() 函数调用时,将str指针赋给了形参p
//函数getmo()内部也没有改变p 指向的内容(等同于str指向的内容)
//但当getmo() 返回时,p并未将其值赋给str ,所以原来的str并没有改变
memcpy(str, "11111", 6);
}
{
p=(char*)malloc(10);
int i = 0;
}
void main()
{
char *str;
getmo(str);//传递了一个指针到函数,函数内部不能改变原来的指针本身,只能改变指针指向的内容
//换句话说,getmo() 函数调用时,将str指针赋给了形参p
//函数getmo()内部也没有改变p 指向的内容(等同于str指向的内容)
//但当getmo() 返回时,p并未将其值赋给str ,所以原来的str并没有改变
memcpy(str, "11111", 6);
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询