因为要移植到linux不能使用win32的api多编码转换只能使用libconv,
用过atl的转换宏的一定认为他很方便很容易使用,不幸的是atl宏存在潜在的内存问题,
因为它是用释放的内存传递结果。
~CW2AEX() throw()
{
if( m_psz != m_szBuffer )
{
free( m_psz );//释放内存
}
}
operator LPSTR() const throw()
{
return( m_psz );//返回指针
}
反复试验了下虽然没有明确的发现内存问题但既然存在这种潜在的风险方法,是不能使用在服务器上了。
考虑用一个动态的字符串数组传递所有结果,并在函数结束的时候一起释放。
在函数体的开始位置声明宏 CONVHEAD展开后是
list< string > convhead_buf
使用宏
#define U2G(in) (conv_utog(in, convhead_buf))? (*(--convhead_buf.end())).c_str():""
定义一个if结构返回最后压栈的字符串。
在函数体内压入返回的字符串。
这样就可以实现在两个字符间方便的转换而不用考虑内存问题了
CONVHEAD;
printf(U2G(G2U("你好哈/r/n")));
全部例子工程保存在: