关于cstring ->string-> const char * 用U2A一步转换 错误的内存问题
2014-03-25 11:32
603 查看
// CStringTest.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include <iostream> #include <string> #include <atlstr.h> using namespace std; static std::string U2A(CString cstring) { if (::IsBadStringPtr(cstring,-1)) return ""; int cchStr = ::WideCharToMultiByte(CP_ACP, 0, cstring, -1, NULL, 0, NULL, NULL); char* pstr = new char[cchStr + 1]; if(pstr != NULL) ::WideCharToMultiByte(CP_ACP, 0, cstring, -1, pstr, cchStr, NULL, NULL); pstr[cchStr] = '\0'; std::string str(pstr); delete []pstr; return str; } static CString A2U(const std::string& sstring) { int cchStr = (int) sstring.length() + 1; wchar_t* pwstr = new wchar_t[cchStr]; if(pwstr != NULL) ::MultiByteToWideChar(CP_ACP, 0, sstring.c_str(), -1, pwstr, cchStr); CString strTmp(pwstr); delete []pwstr; return strTmp; } int _tmain(int argc, _TCHAR* argv[]) { CString cstr = _T("this is cstring"); //正确 string str = U2A(cstr); const char *p = str.c_str(); //正确 std::string p1 = (U2A(cstr)).c_str(); //错误 //错误可能原因:U2A函数返回的是string类型局部变量, //出了函数范围,局部变量指针被释放,但是开辟的内存区域还没有释放, //由于没有像上面那样用string类型对象重新开辟内存用于接收返回的局部变量的内容。 //const char* p2 指向了已经释放了的指针 const char* p2 = U2A(cstr).c_str(); //错误 cout << p << endl; cout << p1 << endl; cout << p2 << endl; system("pause"); return 0; }
View Code
相关文章推荐
- VS2010 编码问题 不能将参数 1 从“ATL::CStringT<BaseType,StringTraits>”转换为“const char *”
- 关于CString剖析,“strcmp”: 不能将参数1从“CString”转换为“const char *”问题
- cocos2d-x 关于 std::string 与 const char* 之间转换的奇怪问题
- 关于CString剖析,“strcmp”: 不能将参数1从“CString”转换为“const char *”问题
- error C2440: “初始化”: 无法从“const char *”转换为“ATL::CStringT<BaseType,StringTraits>”
- 关于CString剖析,“strcmp”: 不能将参数1从“CString”转换为“const char *”问题
- 关于CString剖析,“strcmp”: 不能将参数1从“CString”转换为“const char *”问题
- 关于CString剖析,“strcmp”: 不能将参数1从“CString”转换为“const char *”问题
- 关于CString剖析,"strcmp": 不能将参数1从"CString”"转换为"const char *"问题
- 关于CString剖析,“strcmp”: 不能将参数1从“CString”转换为“const char *”问题 from http://blog.csdn.net/cobay/article/details/3556307
- CString string char* int的转换问题!!
- C++: VC6转VC8出现问题:error C2664: “fopen”: 不能将参数 1 从“CString”转换为“const char *” from http://www.cnblogs.com/moon2bird/archive/2009/02/27/1399675.html
- vs2017下关于MFC中string用CString中Format转换出现乱码错误
- Cstring转int型问题(error C2664: “atoi”: 不能将参数 1 从“CString”转换为“const char *”))
- c++中的一些类型转换 : CString,string,int ,long,double,char*,const char*,date等----留着备用
- CString, const char*,string与Unicode,multi-byte字符集转换
- inet_addr”: 不能将参数 1 从“CString”转换为“const char *”1>
- c++中的一些类型转换 : CString,string,int ,long,double,char*,const char*,date等
- 【CString与string转换】不存在从 "LPWSTR" 转换到 "std::basic_string<char, std::char_traits<char>, std::allocator(转)
- CString和string和CONST CHAR*的转换