VS2010 CString 提示无效指针问题

ponydph 2012-06-18 10:41:35
CTestApp
{
成员拉变量声明:
CString m_strPath;

}





//读取系统的配置文件,声音文件的路径
CTestApp::ReadConfig()
{
char lpszPathName[MAX_PATH];
memset(lpszPathName, 0x0, sizeof(lpszPathName));
::GetModuleFileNameA(::AfxGetInstanceHandle(), lpszPathName, MAX_PATH);
m_strPath=lpszPathName; //提示 m_strPath 无效指针
}

如何解决? 代码从Vc6移植过来的
...全文
741 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
too_old_coder 2013-05-08
  • 打赏
  • 举报
回复
m_strPath=CString(lpszPathName);
Occam's_Razor 2012-08-20
  • 打赏
  • 举报
回复
可以调试和可以看到变量值是两个概念好吧
ponydph 2012-06-21
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 的回复:]

看来一开始就理解错了,还以为是程序运行错误呢...
如20楼所说,Release是编译器优化的。
要想如debug一样调试,需要改很多工程设置,关优化,加调试信息等。这样其实没有没有调试的意义了。
如果只加调试信息,断点很难设置,变量也很难找到。

可参考
http://www.cnblogs.com/fishtreeyu/archive/2011/11/27/2265023.htm……
[/Quote]

没有更改设置,Release模式下 在运行阶段,也可以增加断点 调试的。

jpinglove 2012-06-20
  • 打赏
  • 举报
回复
嗯,楼上朋友说的有道理!!!
vioy 2012-06-20
  • 打赏
  • 举报
回复
看来一开始就理解错了,还以为是程序运行错误呢...
如20楼所说,Release是编译器优化的。
要想如debug一样调试,需要改很多工程设置,关优化,加调试信息等。这样其实没有没有调试的意义了。
如果只加调试信息,断点很难设置,变量也很难找到。

可参考
http://www.cnblogs.com/fishtreeyu/archive/2011/11/27/2265023.html
ponydph 2012-06-20
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 的回复:]

Release 下编译器优化了的
变量一般看不到,除非你在选项关掉优化选项
[/Quote]
类的函数进不去,但是局部变量可以
Occam's_Razor 2012-06-20
  • 打赏
  • 举报
回复
Release 下编译器优化了的
变量一般看不到,除非你在选项关掉优化选项
ponydph 2012-06-20
  • 打赏
  • 举报
回复
后来调试 发现不是这两句问题,应该是Release环境下 CString类型变量 可能显示不出字符内容导致。
ponydph 2012-06-20
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 的回复:]

引用 14 楼 的回复:

m_strPath 是类的成员变量,在Debug模式下 调试都正确,但是在Release模式下,进入获取路径函数,然后调试出来后, m_strPa……


你试试下面两个,看看是不是Release版也没问题。如果是这样的话是字符编码的问题导致的

1. char lpszPathName[MAX_PATH]; 改成 TCHAR lpszPathName……
[/Quote]
效果是一样的,是否在Release模式下 无法显示成员变量的值? 但是函数中定义的局部CString 变量可以显示啊


ponydph 2012-06-20
  • 打赏
  • 举报
回复
我试试
ponydph 2012-06-19
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 的回复:]

在调用GetModuleFileNameA之前,m_strPath是有效的吗?如果是有效就是GetModuleFileNameA的参数问题,或者应该用GetModuleFileNameW,Unicode版本
[/Quote]

m_strPath 是类的成员变量,在Debug模式下 调试都正确,但是在Release模式下,进入获取路径函数,然后调试出来后, m_strPath显示的内容就变成了无效的指针了
vioy 2012-06-19
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 的回复:]

m_strPath 是类的成员变量,在Debug模式下 调试都正确,但是在Release模式下,进入获取路径函数,然后调试出来后, m_strPa……
[/Quote]

你试试下面两个,看看是不是Release版也没问题。如果是这样的话是字符编码的问题导致的

1. char lpszPathName[MAX_PATH]; 改成 TCHAR lpszPathName[MAX_PATH];
2. GetModuleFileNameA改成GetModuleFileName
tankgreat 2012-06-19
  • 打赏
  • 举报
回复
m_strPath=CString(lpszPathName);
vioy 2012-06-18
  • 打赏
  • 举报
回复
在调用GetModuleFileNameA之前,m_strPath是有效的吗?如果是有效就是GetModuleFileNameA的参数问题,或者应该用GetModuleFileNameW,Unicode版本
ponydph 2012-06-18
  • 打赏
  • 举报
回复
char lpszPathName[MAX_PATH];
memset(lpszPathName, 0x0, sizeof(lpszPathName));
::GetModuleFileNameA(::AfxGetInstanceHandle(), lpszPathName, MAX_PATH);
m_strPath=lpszPathName; //在这里 鼠标放到m_strPath 成员变量上则提示无效指针,
int nPos=m_strPath.ReverseFind('\\');
m_strPath=m_strPath.Left(nPos+1);//

CString strIniFile=m_strPath;//这里的 strIniFile 变量 鼠标放上去,就能提示出字符内容
strIniFile+="Settings.ini";
ponydph 2012-06-18
  • 打赏
  • 举报
回复
-
m_strPath <错误的指针> ATL::CStringT<char,StrTraitMFC_DLL<char,ATL::ChTraitsCRT<char> > >

我在Debug模式下查看 没有提示错误,
但是在Release模式下 调试 提示上面的错误
ponydph 2012-06-18
  • 打赏
  • 举报
回复
不是Unicode
路径有中文的
tengerye 2012-06-18
  • 打赏
  • 举报
回复
可能是因为路径中文,你把路径换成英文试试。
  • 打赏
  • 举报
回复
是否Unicode?
把编译器的保存发出来,肯定不是“m_strPath 无效指针”,是不是无法赋值之类的
不能memset &m_strPath (和你贴的代码无关)
ponydph 2012-06-18
  • 打赏
  • 举报
回复
有人遇见我没有?
加载更多回复(5)

16,472

社区成员

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

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

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