下面这一段写会发送内存泄露吗(菜鸟)

下面这一段写会发送内存泄露吗(初学者)
std::string 转 char* 函数
char* string2char(std::string str)
{
  char* cRet;
  const int i = str.length();
  cRet = new char[i+1];
  strcpy(cRet,str.c_str());
  return cRet;
}

要delete[]吗? delete应该放在哪里。
------解决思路----------------------
#include <stdlib.h>
#include <malloc.h>
char* string2char(std::string str) {//std::string 转 char* 函数
    static char* cRet=NULL;
    char *p;
    const int i = str.length();
    if (cRet==NULL) {
        cRet=(char *)malloc(i);
    } else {
        p=realloc(cRet,i);
        if (p!=NULL) cRet=p;
    }
    strcpy(cRet,str.c_str());
    return cRet;
   //进程退出时,操作系统会自动回收cRet指向的内存。
}

------解决思路----------------------
调用这个函数之后,你就在堆上申请了一块内存,函数的返回值指向这块内存,如果要释放这块内存,可以用一个本地变量保存返回值,然后在适当的时候进行释放,不过这样是有风险的,因为在你的delete语句执行之前可能该本地变量所在的函数返回了,所以建议将堆内存申请写成一个类,堆内存的释放写在析构函数中,这样你可以使用该类的对象操作操作堆内存,而该对象所在的函数一旦返回,则系统会自动调用析构函数,则一般不会有内存泄漏(只是一般情况,因为析构函数也可能在delete语句执行之前出现意外终止),所以操作堆内存要小心又小心。