关于cstring ->string-> const char * 用U2A一步转换 错误的内存问题
2024-09-22 06:42:33
// 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 ;
}
最新文章
- 借助亚马逊S3和RapidMiner将机器学习应用到文本挖掘
- pg gem 安装(postgresql94)
- UCanCode发布升级E-Form++可视化源码组件库2014 全新版 (V20.01)!
- Python之文件读写
- VC6.0和VS2010转换时经常遇到的问题
- l来自wentao:项目加入缓存(redis),实时调试时用 -----可视化缓存,flushdb
- FTS抓包看L2CAP Connection的建立(二)
- M - 昂贵的聘礼 - poj1062
- MySQL 触发器例子(两张表同步增加和删除)
- 解决xcode7.3的一个bug的方法
- 移动web开发经验
- 汇编指令-adr与ldr伪汇编区别(8)
- 【深圳】大湾区第三次.NET技术交流会(网络直播)
- Exchanger兄弟线程间数据信息交换
- 在linux服务器上搭建nvidia-docker环境
- 第一章 Bootstrap简介
- tomcat设置错误页面
- Learning-Python【6】:Python数据类型(2)—— 列表、元组
- ajax全选、全不选、反选、单删/批删
- node api 之:stream - 流