cstring的问题

roman_v 2009-07-15 02:04:49
刚才看到这篇文章http://blog.csdn.net/0011411/archive/2005/06/22/400363.aspx
简单测试了下其中的例子。
char* p = NULL;
const char* q = NULL;
{
CString str = "abcd";
q = (LPCTSTR)str;
p = str.GetBuffer(20);
AfxMessageBox(q);// 合法的
strcpy(p, "this is test");//合法的,
}
AfxMessageBox(q);// 非法的,可能完蛋
strcpy(p, "this is test");//非法的,可能完蛋

vc 6.0下第一个msgbox的弹出来是乱码,第二个也是。调试时候看了下变量,q和一开始str指向的是同一片内存,getbuffer之后p和str指向另一片内存,然后q指向的那块区域就乱码了。这是为什么呢?

vc 2008(非 unicode)下第一个msbox弹出来是abcd,第二个乱码。

...全文
39 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
gg606 2009-07-16
  • 打赏
  • 举报
回复
哦,知道了,后两句是因为str已经析构!所以对那些地址的引用都可能出问题
gg606 2009-07-16
  • 打赏
  • 举报
回复


q = (LPCTSTR)str; ////q指向了str的内存,只读
p = str.GetBuffer(20); ///如果参数为4或更小,p也将指向同一内存,但参数20大于字符串长度,
//于是CString新分配一块内存,并返回新内存的指针,原内存被释放(标记为0xdd,乱码)
AfxMessageBox(q);// 合法的,但乱码
strcpy(p, "this is test");//合法的,
}
AfxMessageBox(q);// 非法的?我也不知为什么非法,难道是说它指向的内容“有可能”被更改了?
strcpy(p, "this is test");//?非法的,可能完蛋,你没省略语句吧?
roman_v 2009-07-16
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 gg606 的回复:]


q = (LPCTSTR)str;  ////q指向了str的内存,只读
p = str.GetBuffer(20); ///如果参数为4或更小,p也将指向同一内存,但参数20大于字符串长度,
//于是CString新分配一块内存,并返回新内存的指针,原内存被释放(标记为0xdd,乱码)
AfxMessageBox(q);// 合法的,但乱码
strcpy(p, "this is test");//合法的,
}
AfxMessageBox(q);// 非法的?我也不知为什么非法,难道是说它指向的内容“有可能”被更改了?
strcpy(…
[/Quote]

刚才debug看了下内存,确实是参数大于4就重新分配,原内存释放。。
不过今天在 } 这就出错了。。记得昨天没的。。囧。。
周成风 2009-07-15
  • 打赏
  • 举报
回复
应该是正确的,感觉是VC6中CString重载操作符LPCTSTR,可能需要先分配一块内存,机器没装VC,不能实验。。
roman_v 2009-07-15
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 bowfnfje 的回复:]
vc6.0与 VC2008之所以能看到不同的结果,是因为CString 版本不同,

在vc6下能取到乱码而不报错,可能是CString 一 BUG吧 而 vc2008 做了完善!

p = str.GetBuffer(20); 这句话,在vc6.0下可能会出错,能正常运行只是偶然!将20改为4可正常取到想要的文本!

[/Quote]


其实我只是想求证这篇文章写得对不对,按文中的说法,p = str.GetBuffer(20)会在其他地方另辟一块内存,所以是不会出错的。。

ms你们都没看那文章。。
bowfnfje 2009-07-15
  • 打赏
  • 举报
回复
vc6.0与 VC2008之所以能看到不同的结果,是因为CString 版本不同,

在vc6下能取到乱码而不报错,可能是CString 一 BUG吧 而 vc2008 做了完善!

p = str.GetBuffer(20); 这句话,在vc6.0下可能会出错,能正常运行只是偶然!将20改为4可正常取到想要的文本!
汪宁宇 2009-07-15
  • 打赏
  • 举报
回复
'\0'
roman_v 2009-07-15
  • 打赏
  • 举报
回复
这个我知道 我只是想知道那篇文章说得对不对。。。他说第一个AfxMessageBox(q);是合法的 ,但是我6.0下弹出来是乱码。。
wltg2001 2009-07-15
  • 打赏
  • 举报
回复
CString是一个类,它对字符串做了很多封装,两者并不是一回事,强制转化出现错误是很正常的,即使q和str指向同一内存区也说明不了什么,CStrin对象中除了字串之外还有其实东西。

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧