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 ,木有任何问题
系统在函数返回的时候会给你重新拷贝一份
======
返回的是个类,不是这个类的指针,也不是这个类的引用
so ,木有任何问题
系统在函数返回的时候会给你重新拷贝一份
#4
你这个函数写的啊,。。。唉,写得挺好,要是我。。。也这么写。。。
#5
返回的是一个临时对象,会重新分配空间. ==》有道理!看来解答了我的疑惑,呵呵!
#6
strDir空间是释放了,但其地址返回了。可以给变量来引用。我们用的是返回值,又不是函数里面的strDir。
#7
#8
The CString assignment (=) operator reinitializes an existing CString object with new data.
放心吧,CString 的=操作已经为自己分配空间了。
放心吧,CString 的=操作已经为自己分配空间了。
#9
嘿嘿,这样说的很对的啊,这个不是你写的吗
#10
应该是没问题的吧,我看不出问题来
#11
结贴去了!
#12
不好意思,分数有点分配错了,不过也暂时只能够这样了!多谢大家啊!
#1
返回的是一个临时对象,会重新分配空间.
你的担心是多余的.
你的担心是多余的.
#2
当然,根据VC的返回值优化原理,这个临时变量可以消除.
#3
static CString GetModulePath(HMODULE hModule = NULL);
======
返回的是个类,不是这个类的指针,也不是这个类的引用
so ,木有任何问题
系统在函数返回的时候会给你重新拷贝一份
======
返回的是个类,不是这个类的指针,也不是这个类的引用
so ,木有任何问题
系统在函数返回的时候会给你重新拷贝一份
#4
你这个函数写的啊,。。。唉,写得挺好,要是我。。。也这么写。。。
#5
返回的是一个临时对象,会重新分配空间. ==》有道理!看来解答了我的疑惑,呵呵!
#6
strDir空间是释放了,但其地址返回了。可以给变量来引用。我们用的是返回值,又不是函数里面的strDir。
#7
我建议你再了解一下 返回值优化的知识。
这对设计代码还是有好处的。 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 的=操作已经为自己分配空间了。
放心吧,CString 的=操作已经为自己分配空间了。
#9
嘿嘿,这样说的很对的啊,这个不是你写的吗
#10
应该是没问题的吧,我看不出问题来
#11
结贴去了!
#12
不好意思,分数有点分配错了,不过也暂时只能够这样了!多谢大家啊!