c++ malloc 与 free 的问题
wchar_t*c2w(constchar*str){intlength=strlen(str)+1;wchar_t*t=(wchar_t*)malloc(sizeof(...
wchar_t* c2w(const char *str)
{
int length = strlen(str)+1;
wchar_t *t = (wchar_t*)malloc(sizeof(wchar_t)*length);
memset(t,0,length*sizeof(wchar_t));
MultiByteToWideChar(CP_ACP,0,str,strlen(str),t,length);
//free(t);
//t=NULL;
return t;
}
---上面是代码
在返回之前free了就会报错,向这种情况怎么使用free呢? 展开
{
int length = strlen(str)+1;
wchar_t *t = (wchar_t*)malloc(sizeof(wchar_t)*length);
memset(t,0,length*sizeof(wchar_t));
MultiByteToWideChar(CP_ACP,0,str,strlen(str),t,length);
//free(t);
//t=NULL;
return t;
}
---上面是代码
在返回之前free了就会报错,向这种情况怎么使用free呢? 展开
展开全部
t既然是被返回的,那么就是说 这段内存在返回后还需要使用
在使用后,确定不再使用时调用free即可
如果在程序中会一直使用,那么在退出程序时free
注意保持返回值的值,通俗点说,如果str=c2w(...)那么这个str的值,就是以后你要free的值,要保证在free前,这个值不被改变,不然就会出现内存泄露
流程大致这样
wchar_t* result;
result = c2w(your parameter);
//using result to do something
free(result);
result = NULL;//不是必须 但建议如此 防野指针甚于防川
在使用后,确定不再使用时调用free即可
如果在程序中会一直使用,那么在退出程序时free
注意保持返回值的值,通俗点说,如果str=c2w(...)那么这个str的值,就是以后你要free的值,要保证在free前,这个值不被改变,不然就会出现内存泄露
流程大致这样
wchar_t* result;
result = c2w(your parameter);
//using result to do something
free(result);
result = NULL;//不是必须 但建议如此 防野指针甚于防川
展开全部
你怎么能返回一个free了的对象呢?
你一定要用C++吗?
另:如果一定要用malloc的方法,请改用calloc(length,sizeof(wchar_t)),那就不用再memset了,
否则应用wchar_t *t = new wchar_t[length+1];
如果是这样的话有几种解决方案,
多写一个release函数,专门用来销毁新生成的对象。//如果是C语言可以采取这种做法,显式提示用户要释放对象。
void release(wchar_t* t)
{
free(t);//calloc对应free,new[]对应delete[]
}
使用智能指针shared_array<wchar_t>,也就是改写成如下写法://前提是你的编译器支持c++11
shared_array<wchar_t> c2w(const char *str)
{
int length = strlen(str)+1;
wchar_t* t=new wchar_t[length+1];
shared_array<wchar_t> result(t);
MultiByteToWideChar(CP_ACP,0,str,strlen(str),t,length);
return result;
}
3.把这个字符串封装到类里面。
class A
{
w_char *t;
public:
A(const char *str)
{
int length = strlen(str)+1;
t=new wchar_t[length+1];
MultiByteToWideChar(CP_ACP,0,str,strlen(str),t,length);
}
wchar_t* c2w()
{
return t;
}
~A()
{
delete[] t;
}
}
4.如果c2w函数的使用者非常有限(仅局限在同一文件下,不跨文件调用),由c2w函数的使用者负责free/delete[]。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
malloc在堆中分配内存,free释放堆中分配的内存
这里free释放内存之后,t就成了野指针,肯定不能再用,free用于接收这个函数返回值的指针变量,不能在这个子函数中释放
这里free释放内存之后,t就成了野指针,肯定不能再用,free用于接收这个函数返回值的指针变量,不能在这个子函数中释放
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
free()了然后设置成NULL是没问题,但是返回出去NULL指针函数就失去了意义。如果不赋值成NULL,那么返回出去的将是一个无意义的指针,也就是野指针,访问非法!这种情况可以传字符串指针进来当输出,也可以返回string类型!最好不要再函数内部malloc,到函数外部free,虽然不会错,但这种编程习惯容易引起内存泄露的问题!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
在函数外面控制内存的free
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询