关于cstring ->string-> const char * 用U2A一步转换 错误的内存问题
// 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一步转换 错误的内存问题的更多相关文章
- CString转换为const char*
CString str=_T("这是我的测试程序.");// 先得到要转换为字符的长度const size_t strsize=(str.GetLength()+1)*2; // ...
- 终于搞定在VS2010中将CString转换为const char*
最近碰到了CString 转 const char *的问题. 以前只要简单的一个强制转换就OK了,可现在是不行了,搜索了很多资料,终于搞定,主要是Unicode和ANSI的问题,只要做一个转换就可以 ...
- VS2010中将CString转换为const char*
最近碰到了CString 转 const char *的问题. 以前只要简单的一个强制转换就OK了,可现在是不行了,搜索了很多资料,终于搞定,主要是Unicode和ANSI的问题,只要做一个转换就可以 ...
- 【DEBUG】不能将参数 1 从“CString”转换为“const char *”
1. 在vc6.0下用CString str;num = atoi(str);就可以顺利取到num: 但是同样代码拿到vs2008就报错,error C2664: "atoi": ...
- MFC中cstring,string和char[]的相互转化
int 转 CString:CString.Format("%d",int);...............................string 转 CString CSt ...
- string,const char*,char*之间的相互转换
1. string转const char* string s = "abc"; const char* c_s = s.c_str(); 2. const char*转string ...
- [转载] C++ string, const char*, char* 之间互相转换
1, string转const char* 类型 string str = "abcdef"; const char* con_str = string.c_str() 2, co ...
- string,const char*, char*转换之后还是指向同一片内存地址么?
class Same { public: void reverse(const char* str) { char* A = const_cast<char*>(str); A[] = ' ...
- CString转const char
CString转换成const char 需要考虑一个因素: 你使用是否为unicode 不使用unicode: CString Cstr("aaaaaaa"); co ...
随机推荐
- [Kernel]内核版本添加字符和内核版本'+'解决
转自:http://blog.csdn.net/adaptiver/article/details/7225980 之前每次由于git仓库编译出来每次都带有'+', 导致都需要使用git archiv ...
- Eclipse里安装插件
1.在eclipse中选择 help->install new software. 2.在work with 框中输入:Indigo - http://download.eclipse.org/ ...
- git过期处理
删除git下的文件:C:\Users\Java\AppData\Roaming\syntevo\......\7\settings.xml删除settings.xml文件即可
- m个苹果放在n个盘子里面有多少种放法?(动态规划)
m个苹果放在n个盘子里面有多少种放法?(动态规划) 实现代码如下: #include <iostream> using namespace std; int s(int m ,int n) ...
- 向大家推荐一个C/C++通用Makefile
在使用 Makefile 之前,只需对它进行一些简单的设置即可:而且一经设置,即使以后对源程序文件有所增减一般也不再需要改动 Makefile.因此,即便是一个没有学习过 Makefile 书写规则的 ...
- java-过滤器Filter_多个Filter的执行顺序
http://www.cnblogs.com/HigginCui/p/5772514.html [Filter链] *在一个web应用中,可以开发编写多个Filter,这些Filter组合起来称为一个 ...
- Mac下删除安装的pkg
Mac下的安装和删除都比windows更加简单清晰,这点在dmg方式下非常明显,但很多时候我们会使用pkg来进行安装,这样的安装想删除就有点麻烦了. 比如,我安装了Golang这个pkg用于g ...
- StarRTC , AndroidThings , 树莓派小车,公网环境,视频遥控(一)准备工作
原文地址:http://blog.starrtc.com/?p=48 啥也不说,先来个视频看看效果 视频播放器 00:00 00:54 概述为了体现StarRTC的实时音视频传输能 ...
- smo算法
文章在word里写好了,公式没法贴到论坛里,所以直接截图了
- vector、map删除当前记录
map<string, string> sMap; map<string, string>::iterator iter; for(iter = sMap.begin();it ...