请教一个MFC的CString类的问题

时间:2022-01-05 00:22:03
弱弱的问大家一个问题,有这么一个类:

class CUtility {
public:
static CString GetModulePath(HMODULE hModule = NULL);
}

CString CUtility::GetModulePath(HMODULE hModule /* = NULL */)
{
TCHAR buf[MAX_PATH] = {'\0'};
CString strDir, strTemp;

::GetModuleFileName( hModule, buf, MAX_PATH);
strTemp = buf;
strDir = strTemp.Left( strTemp.ReverseFind('\\') + 1 );
return strDir;
}


为什么我始终感觉这个函数用起来有风险,我的看法:
变量strDir没有修饰成static属性,在返回strDir,strDir指针所指向的空间已经被析构函数给释放了,这样它所指向的就是一个空闲区域的指针,
而程序在调用这个函数并访问这个空闲区域的时候,很容易出现意外?

因为对CString的掌握是在太薄弱,不知道大家的看法是怎样的?谢谢哈!

12 个解决方案

#1


返回的是一个临时对象,会重新分配空间.
你的担心是多余的.

#2


当然,根据VC的返回值优化原理,这个临时变量可以消除.

#3


  static CString GetModulePath(HMODULE hModule = NULL);
======
返回的是个类,不是这个类的指针,也不是这个类的引用
so ,木有任何问题
系统在函数返回的时候会给你重新拷贝一份

#4


你这个函数写的啊,。。。唉,写得挺好,要是我。。。也这么写。。。

#5


返回的是一个临时对象,会重新分配空间. ==》有道理!看来解答了我的疑惑,呵呵!

#6


strDir空间是释放了,但其地址返回了。可以给变量来引用。我们用的是返回值,又不是函数里面的strDir。

#7


引用 5 楼 silitex 的回复:
返回的是一个临时对象,会重新分配空间. ==》有道理!看来解答了我的疑惑,呵呵!

我建议你再了解一下 返回值优化的知识。
这对设计代码还是有好处的。 http://www.google.com.hk/search?hl=zh-CN&source=hp&q=%E8%BF%94%E5%9B%9E%E5%80%BC%E4%BC%98%E5%8C%96&btnG=Google+%E6%90%9C%E7%B4%A2&meta=&aq=f&aqi=&aql=&oq=&gs_rfai=

#8


The CString assignment (=) operator reinitializes an existing CString object with new data. 

放心吧,CString 的=操作已经为自己分配空间了。

#9


引用 1 楼 loaden 的回复:
返回的是一个临时对象,会重新分配空间.
你的担心是多余的.


嘿嘿,这样说的很对的啊,这个不是你写的吗

#10


应该是没问题的吧,我看不出问题来

#11


结贴去了!

#12


不好意思,分数有点分配错了,不过也暂时只能够这样了!多谢大家啊!

#1


返回的是一个临时对象,会重新分配空间.
你的担心是多余的.

#2


当然,根据VC的返回值优化原理,这个临时变量可以消除.

#3


  static CString GetModulePath(HMODULE hModule = NULL);
======
返回的是个类,不是这个类的指针,也不是这个类的引用
so ,木有任何问题
系统在函数返回的时候会给你重新拷贝一份

#4


你这个函数写的啊,。。。唉,写得挺好,要是我。。。也这么写。。。

#5


返回的是一个临时对象,会重新分配空间. ==》有道理!看来解答了我的疑惑,呵呵!

#6


strDir空间是释放了,但其地址返回了。可以给变量来引用。我们用的是返回值,又不是函数里面的strDir。

#7


引用 5 楼 silitex 的回复:
返回的是一个临时对象,会重新分配空间. ==》有道理!看来解答了我的疑惑,呵呵!

我建议你再了解一下 返回值优化的知识。
这对设计代码还是有好处的。 http://www.google.com.hk/search?hl=zh-CN&source=hp&q=%E8%BF%94%E5%9B%9E%E5%80%BC%E4%BC%98%E5%8C%96&btnG=Google+%E6%90%9C%E7%B4%A2&meta=&aq=f&aqi=&aql=&oq=&gs_rfai=

#8


The CString assignment (=) operator reinitializes an existing CString object with new data. 

放心吧,CString 的=操作已经为自己分配空间了。

#9


引用 1 楼 loaden 的回复:
返回的是一个临时对象,会重新分配空间.
你的担心是多余的.


嘿嘿,这样说的很对的啊,这个不是你写的吗

#10


应该是没问题的吧,我看不出问题来

#11


结贴去了!

#12


不好意思,分数有点分配错了,不过也暂时只能够这样了!多谢大家啊!