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呢?
展开
 我来答
风若远去何人留
推荐于2016-08-22 · 知道合伙人互联网行家
风若远去何人留
知道合伙人互联网行家
采纳数:20412 获赞数:450134
专业C/C++软件开发

向TA提问 私信TA
展开全部
t既然是被返回的,那么就是说 这段内存在返回后还需要使用
在使用后,确定不再使用时调用free即可
如果在程序中会一直使用,那么在退出程序时free

注意保持返回值的值,通俗点说,如果str=c2w(...)那么这个str的值,就是以后你要free的值,要保证在free前,这个值不被改变,不然就会出现内存泄露

流程大致这样
wchar_t* result;

result = c2w(your parameter);
//using result to do something
free(result);
result = NULL;//不是必须 但建议如此 防野指针甚于防川
JINLegend
2013-09-02 · TA获得超过802个赞
知道小有建树答主
回答量:241
采纳率:100%
帮助的人:127万
展开全部

你怎么能返回一个free了的对象呢?

你一定要用C++吗?

另:如果一定要用malloc的方法,请改用calloc(length,sizeof(wchar_t)),那就不用再memset了,

否则应用wchar_t *t = new wchar_t[length+1];

如果是这样的话有几种解决方案,

  1. 多写一个release函数,专门用来销毁新生成的对象。//如果是C语言可以采取这种做法,显式提示用户要释放对象。

void release(wchar_t* t)
{
    free(t);//calloc对应free,new[]对应delete[]
}
  1. 使用智能指针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[]。

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
cppqingyuan
2013-09-02 · 超过44用户采纳过TA的回答
知道答主
回答量:154
采纳率:0%
帮助的人:107万
展开全部
malloc在堆中分配内存,free释放堆中分配的内存
这里free释放内存之后,t就成了野指针,肯定不能再用,free用于接收这个函数返回值的指针变量,不能在这个子函数中释放
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
lovejia
2013-09-02 · 超过22用户采纳过TA的回答
知道答主
回答量:45
采纳率:0%
帮助的人:43.3万
展开全部
free()了然后设置成NULL是没问题,但是返回出去NULL指针函数就失去了意义。如果不赋值成NULL,那么返回出去的将是一个无意义的指针,也就是野指针,访问非法!这种情况可以传字符串指针进来当输出,也可以返回string类型!最好不要再函数内部malloc,到函数外部free,虽然不会错,但这种编程习惯容易引起内存泄露的问题!
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
才子love永恒
2013-09-02 · 超过13用户采纳过TA的回答
知道答主
回答量:77
采纳率:0%
帮助的人:35.7万
展开全部
在函数外面控制内存的free
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式