首页 新闻 会员 周边 捐助

C++中字符串处理问题?好像有内存泄漏,高人来看看?

0
悬赏园豆:5 [已解决问题] 解决于 2013-10-11 09:35

因为代码主要是写Win32在DLL中,所以MFC的东东应该用不了:

const LPCSTR MsgFileMapping_ProtectedProcessID = "WM_Test" ;

//根据传入的字符串生成一个全局的名称
string
GetFileMappingName(LPCSTR msgFileMappingName) { int shareID = RegisterWindowMessage(msgFileMappingName); string mappingID = long2string(shareID); string mappingName = "File_Mapping_ID_" + mappingID ; return mappingName; }
//写入ProcessID到内存文件映射对象区 HANDLE SetProtectedProcessID(DWORD processID) { LPCSTR mappingName
= GetFileMappingName(MsgFileMapping_ProtectedProcessID).c_str(); MessageBox(0,mappingName,"",0); //这是调用,这里有乱码,有时正常显示,有时不正常 return CreateFileMappingData(mappingName,processID); }
问题补充:

其实我想要的功能就是 生成一个字符串如下:

"File_Mapping_ID_" + int类型 -》转换成 LPCSTR

这样,我就可以传给CreateFileMapping函数了。

C++的字符串真真的可以把人弄死,太复杂了,还是VB,C#好啊。

空明流光的主页 空明流光 | 初学一级 | 园豆:111
提问于:2013-10-11 07:38
< >
分享
最佳答案
0

//这里GetFileMappingName返回的是string的值,string返回值GetFileMappingName在函数结束调用的时候就被消毁了,mappingName获取的字符串指针就变成了野指针

LPCSTR mappingName = GetFileMappingName(MsgFileMapping_ProtectedProcessID).c_str();

改为:

string mappingName = GetFileMappingName(MsgFileMapping_ProtectedProcessID);

MessageBox(0,mappingName.c_str(),"",0);

CreateFileMappingData(mappingName.c_str(),processID);

 

收获园豆:3
蒲蜡 | 菜鸟二级 |园豆:205 | 2013-10-11 08:22

够幽默,“野指针”,哈哈,领教了。试试先。

空明流光 | 园豆:111 (初学一级) | 2013-10-11 08:25

确实如大仙的所言,没有乱码了。但我还是没有听懂,这个函数GetFileMappingName返回的string为什么就叫野指针呢? 是在哪里销毁了哪个指针,在哪里引用的时候它变成了野指针,吾乃初学,还望大仙不吝赐教。 

空明流光 | 园豆:111 (初学一级) | 2013-10-11 08:41

关于野指针, C++对象生命周期,你还是到网上搜下,一句两句说不清,看过之后估计你就应该明白了

蒲蜡 | 园豆:205 (菜鸟二级) | 2013-10-11 09:14
其他回答(1)
0

GetFileMappingName 返回的是 std:string 对象

std::string.c_str() 返回 std::string 内部缓冲区的首地址。

LPCSTR mappingName = GetFileMappingName(MsgFileMapping_ProtectedProcessID).c_str();

这段代码等效于:

LPCSTR mappingName = NULL;

{

    std::string str = GetFileMappingName(MsgFileMapping_ProtectedProcessID);

    mappingName = str.c_str();

    // 代码执行到这里,mappingName 指向的地址仍然有效,因为 str 还没有被销毁,也就没有释放 mappingName 指向的地址空间。
}

// 代码执行到这里,str 变量已经被销毁,其内部缓冲区也被释放,那么 mappingName 指向的地址已经不再可用。

收获园豆:2
Launcher | 园豆:45050 (高人七级) | 2013-10-11 09:21

哇,C++这么危险啊,外部变量对它有引用,它竟然也会被释放。看来这生命周期和C#之类确实相差太大了,受教了,谢谢。

支持(0) 反对(0) 空明流光 | 园豆:111 (初学一级) | 2013-10-11 09:33

@沧海一杰: 分太少了,不要见怪。

支持(0) 反对(0) 空明流光 | 园豆:111 (初学一级) | 2013-10-11 09:35
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册