| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 922 人关注过本帖
标题:FormatMessage函数难道会自动申请一个字符串空间 ?
只看楼主 加入收藏
vfdff
Rank: 6Rank: 6
等 级:侠之大者
威 望:8
帖 子:2172
专家分:425
注 册:2005-7-15
结帖率:79.17%
收藏
已结贴  问题点数:5 回复次数:8 
FormatMessage函数难道会自动申请一个字符串空间 ?
程序代码:
string GetErrorMsg()
{
    DWORD dwErrorId = GetLastError();
    LPVOID lpMsgBuf;

    FormatMessage(
        FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
        NULL,
        dwErrorId,
        0,
        (LPSTR) &lpMsgBuf,
        0,
        NULL);

    string strErrorMsg = (char*)lpMsgBuf;
    LocalFree(lpMsgBuf);

    return strErrorMsg;
}
请问为什么lpMsgBuf变量没有申请空间,却要使用LocalFree释放空间
搜索更多相关主题的帖子: 申请 自动 空间 字符 函数 
2010-09-14 01:35
hahayezhe
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:湖南张家界
等 级:贵宾
威 望:24
帖 子:1386
专家分:6999
注 册:2010-3-8
收藏
得分:2 
(LPSTR) &lpMsgBuf,

FormatMessage函数内部调用GlobalAlloc 给lpMsgBuf分配了空间!
2010-09-14 09:18
vfdff
Rank: 6Rank: 6
等 级:侠之大者
威 望:8
帖 子:2172
专家分:425
注 册:2005-7-15
收藏
得分:0 
回复 2楼 hahayezhe
这样的函数实现方式不是稍不留意就造成内存泄露 ?

~~~~~~~~~~~~~~~好好学习~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2010-09-16 00:53
东海一鱼
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:48
帖 子:757
专家分:4760
注 册:2009-8-10
收藏
得分:2 
这种情况太多了。没有垃圾自动回收机制不可避免的。

举世而誉之而不加劝,举世而非之而不加沮,定乎内外之分,辩乎荣辱之境,斯已矣。彼其于世未数数然也。
2010-09-16 11:28
vfdff
Rank: 6Rank: 6
等 级:侠之大者
威 望:8
帖 子:2172
专家分:425
注 册:2005-7-15
收藏
得分:0 
回复 4楼 东海一鱼
如果我在设计这样的代码,我宁愿多传入一个参数,也不愿意这样存在内存泄露操作的表示方法,空间的申请和释放不再一个作用域真的 很危险

~~~~~~~~~~~~~~~好好学习~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2010-09-17 00:57
东海一鱼
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:48
帖 子:757
专家分:4760
注 册:2009-8-10
收藏
得分:0 
这就是理想和现实的差距。有些情况下,不是多一两个参数的问题。而是效率的考量。

譬如你做的一个库中分配的池,作为结果要返回给用户。直接返回,势必要让用户释放它(你不知道,用户什莫时候不再使用它了)。让用户传递一块缓冲地址过来,大数据量不考虑换页效率,单是拷贝就够瞧的。

举世而誉之而不加劝,举世而非之而不加沮,定乎内外之分,辩乎荣辱之境,斯已矣。彼其于世未数数然也。
2010-09-17 19:12
vfdff
Rank: 6Rank: 6
等 级:侠之大者
威 望:8
帖 子:2172
专家分:425
注 册:2005-7-15
收藏
得分:0 
回复 6楼 东海一鱼
加一个参数,可以通过引用方式传递,并不一定要按值的方式进行传递的

~~~~~~~~~~~~~~~好好学习~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2010-09-21 19:59
东海一鱼
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:48
帖 子:757
专家分:4760
注 册:2009-8-10
收藏
得分:0 
让用户传递一块缓冲地址过来,大数据量不考虑换页效率,单是拷贝就够瞧的。

    我这句话的意思是你没法用引用的情况下,比如一个实时数据采集系统。你不可能等用户分配好缓冲区传递给你,你才进行一轮采集。然后把这个缓冲区提交。并获得下一个。而且还有一个用户怎末知道你要的池大小的问题?如果你自己直接分配缓冲区,并提交这个引用的话。又回到了上面的谁释放的问题。

举世而誉之而不加劝,举世而非之而不加沮,定乎内外之分,辩乎荣辱之境,斯已矣。彼其于世未数数然也。
2010-09-22 00:25
vfdff
Rank: 6Rank: 6
等 级:侠之大者
威 望:8
帖 子:2172
专家分:425
注 册:2005-7-15
收藏
得分:0 
回复 8楼 东海一鱼
具体场景具体考虑吧!

对于 实时数据采集系统,我感觉既然是实时的,这就意味着系统应该能保证被采集的数据进行实时的处理,这样的话,应该设计一个FIFO应该就好了

~~~~~~~~~~~~~~~好好学习~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2010-09-22 01:20
快速回复:FormatMessage函数难道会自动申请一个字符串空间 ?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.021339 second(s), 10 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved