我用VS2008用的是宽字节模式,但是MYSQl用的是多字节的,
下面是我写的 Unicode 转 char  但是这个new出来的内存到底怎么释放?
有点不明白!
const char* CDlog::UnicodetoChar(const TCHAR* src)
{
if (NULL == src)
{
return NULL;
}
DWORD dwNum = WideCharToMultiByte(CP_OEMCP,NULL,src,-1,NULL,0,NULL,FALSE);
m_pCharBuf = new char[dwNum];
memset(m_pCharBuf, 0 ,sizeof(char) * (dwNum +1));
WideCharToMultiByte(CP_OEMCP,NULL,src,-1,m_pCharBuf,dwNum,NULL,FALSE);
return m_pCharBuf;
}

解决方案 »

  1.   

    使用后马上释放
    该做法我认为2问题:
    1.编译条件改为MultiByte时,tchar-》char与名字有冲突【歧义】,永远是宽字节编译除外
    2.返回的堆,释放责任后移给客户,容易出错。
    我的做法是样的,写一个类似CString的类,返回cstring对象; 可以用std::wstring,这样不用考虑释放问题【效率要考虑】
      

  2.   

    修正:std::wstring->std::string
      

  3.   

    函数不要这样定义.
    改这样
    const FALSE CDlog::UnicodetoChar(__in const LPWSTR UnicodeChar, __out LPSTR AnsiChar, __in int nSize)
      

  4.   

    其实也可以直接让MYSQL转换编码的
    SELECT CONVERT(CAST(UnicodeChar AS BINARY) USING 'gbk') FROM table
      

  5.   


    这个是查询的,比如说mysql_real_connect 连接都是 const char* 类型 看来还是要把C++的好好看下
      

  6.   

    char host[] = "192.168.1.20";
    char user[] = "root";
    char pwd[] = "root";
    char table[] = "test";mysql_real_connect(mysql, host, user,pwd, table, 3306, NULL, NULL); 
    你直接定义char不行吗,
    为什么一定要用TCHAR呢.