您的位置:首页 > 其它

关于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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐