// CStringTest.cpp : 定义控制台应用程序的入口点。
// #include "stdafx.h"
#include <iostream>
#include <string>
#include <atlstr.h> using namespace std; static std::string U2A(CString cstring)
{
if (::IsBadStringPtr(cstring,-))
return ""; int cchStr = ::WideCharToMultiByte(CP_ACP, , cstring, -, NULL, , NULL, NULL);
char* pstr = new char[cchStr + ];
if(pstr != NULL)
::WideCharToMultiByte(CP_ACP, , cstring, -, 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() + ;
wchar_t* pwstr = new wchar_t[cchStr];
if(pwstr != NULL)
::MultiByteToWideChar(CP_ACP, , sstring.c_str(), -, 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 ;
}

关于cstring ->string-> const char * 用U2A一步转换 错误的内存问题的更多相关文章

  1. CString转换为const char*

    CString str=_T("这是我的测试程序.");// 先得到要转换为字符的长度const size_t strsize=(str.GetLength()+1)*2; // ...

  2. 终于搞定在VS2010中将CString转换为const char*

    最近碰到了CString 转 const char *的问题. 以前只要简单的一个强制转换就OK了,可现在是不行了,搜索了很多资料,终于搞定,主要是Unicode和ANSI的问题,只要做一个转换就可以 ...

  3. VS2010中将CString转换为const char*

    最近碰到了CString 转 const char *的问题. 以前只要简单的一个强制转换就OK了,可现在是不行了,搜索了很多资料,终于搞定,主要是Unicode和ANSI的问题,只要做一个转换就可以 ...

  4. 【DEBUG】不能将参数 1 从“CString”转换为“const char *”

    1.  在vc6.0下用CString str;num = atoi(str);就可以顺利取到num: 但是同样代码拿到vs2008就报错,error C2664: "atoi": ...

  5. MFC中cstring,string和char[]的相互转化

    int 转 CString:CString.Format("%d",int);...............................string 转 CString CSt ...

  6. string,const char*,char*之间的相互转换

    1. string转const char* string s = "abc"; const char* c_s = s.c_str(); 2. const char*转string ...

  7. [转载] C++ string, const char*, char* 之间互相转换

    1, string转const char* 类型 string str = "abcdef"; const char* con_str = string.c_str() 2, co ...

  8. string,const char*, char*转换之后还是指向同一片内存地址么?

    class Same { public: void reverse(const char* str) { char* A = const_cast<char*>(str); A[] = ' ...

  9. CString转const char

    CString转换成const char      需要考虑一个因素: 你使用是否为unicode 不使用unicode: CString  Cstr("aaaaaaa"); co ...

随机推荐

  1. DataGridView使用技巧八:设置单元格的ToolTip

    ToolTip属性用来设置当鼠标移动到单元格上面时的提示内容. DataGridView.ShowCellToolTips=True的情况下,单元格的ToolTip可以表示出来.对于单元格窄小,无法完 ...

  2. 06 Locking and Latching

    本章提要---------------------------------------------------------------6,7,8,9,10,11 这 6 章要细看, 从本章开始how ...

  3. 使用 jQuery UI 和 jQuery 插件构建更好的 Web 应用程序

    简介: 对于那些使用 JavaScript 和 jQuery 库从桌面应用程序转向 Web 应用程序的开发人员来说,他们还不习惯去考虑应用程序基本的外观,因为这些以前都是由操作系统来处理的.了解 jQ ...

  4. 数据库 proc编程九

    第一种动态sql EXEC SQL EXECUTE IMMEDIATE :psql; .仅适用于非select语句 .嵌入SQL语句中不能包含输入宿主变量 void main() { EXEC SQL ...

  5. 关于Jsp中的三种弹框

    对话框有三种 1:只是提醒,不能对脚本产生任何改变: 2:一般用于确认,返回 true 或者 false ,所以可以轻松用于 if...else...判断 3:一个带输入的对话框,可以返回用户填入的字 ...

  6. python中的矩阵、多维数组----numpy

    https://docs.scipy.org/doc/numpy-dev/user/quickstart.html  (numpy官网一些教程) numpy教程:数组创建 python中的矩阵.多维数 ...

  7. Struts tags--Data tags

      struts tags详解之<s:bean> Description     Bean标签,当然需要一个JavaBean.它的属性值的操作是经由Bean标签中的参数属性来进行赋值.当然 ...

  8. Hibernate Query Language查询:

    Hibernate Query Language查询: Criteria查询对查询条件进行了面向对象封装,符合编程人员的思维方式,不过HQL(Hibernate Query Language)查询提供 ...

  9. nginx报错:No package erlang available

    问题 yum install erlang 报错:No package erlang available 同样的,如果我们在安装nginx的时候出现"No package nginx ava ...

  10. 【转】 如何利用C#代码来进行操作AD

    要用代码访问 Active Directory域服务,需引用System.DirectoryServices命名空间,该命名空间包含两个组件类,DirectoryEntry和 DirectorySea ...