Win32释放环境变量导致Windows断点 我有一个Win32 C++应用程序,我把所有的环境变量都存储在一个地图中。
在我的应用程序中调用Win32函数FreeEnvironmentStrings()时,我在MSVC++中得到一个奇怪的Windows断点。首先,我不知道这意味着什么&为什么会发生 我如何解决我的问题&出了什么问题 这是我在主函数中调用的函数&导致断点的函数:Win32释放环境变量导致Windows断点 我有一个Win32 C++应用程序,我把所有的环境变量都存储在一个地图中。,c++,winapi,environment-variables,C++,Winapi,Environment Variables,在我的应用程序中调用Win32函数FreeEnvironmentStrings()时,我在MSVC++中得到一个奇怪的Windows断点。首先,我不知道这意味着什么&为什么会发生 我如何解决我的问题&出了什么问题 这是我在主函数中调用的函数&导致断点的函数: std::map <tstring, tstring> GetEnvironmentVariablesEx() { // Post: Get all windows environment variables &
std::map <tstring, tstring> GetEnvironmentVariablesEx()
{
// Post: Get all windows environment variables & store in a
// map(key=env.. variable name, value=env variable value)
std::map <tstring, tstring> envVariables;
TCHAR* environVar = GetEnvironmentStrings();
TCHAR* pos = _tcschr( environVar, _T('\0') );
// Skip over the "=::=::\0" of the environVar string
if ( pos != NULL ) { environVar = ++pos; pos = _tcschr( environVar, _T('\0') ); }
else return envVariables;
// I removed the following code because its long & distracting: the error still occurs without the code
// Code: ...use cstring functions to extract environ variables & values & store in map
FreeEnvironmentStrings( environVar ); // Breakpoint triggered here: "Windows has triggered a breakpoint in the application. This may be due to a corruption of the heap, which indicates a bug in myApp.exe or any of the DLLs it has loaded."
return envVariables;
}
std::map GetEnvironmentVariablesEx()
{
//Post:获取所有windows环境变量并存储在
//映射(key=env..variable name,value=env variable value)
映射变量;
TCHAR*environVar=GetEnvironmentStrings();
TCHAR*pos=_tcschr(environVar,_T('\0'));
//跳过environVar字符串的“=::=::\0”
如果(pos!=NULL){environVar=++pos;pos=_tcschr(environVar,_T('\0'));}
否则返回变量;
//我删除了下面的代码,因为它很长而且让人分心:没有代码,错误仍然会发生
//代码:…使用cstring函数提取环境变量和值并存储在映射中
FreeEnvironmentStrings(environVar);//此处触发的断点:“Windows已触发应用程序中的断点。这可能是由于堆损坏,这表明myApp.exe或其加载的任何DLL中存在错误。”
返回变量;
}
您正在更改environVar
指向的内容,因此您没有将有效的环境字符串指针交给FreeEnvironmentString
函数
在修改之前将原始的environVar
保存在某个地方,并在Free
调用中使用它
TCHAR* tobefreeed = GetEnvironmentStrings();
TCHAR* environVar = tobefreeed;
...
FreeEnvironmentStrings( tobefreeed );
您正在更改
environVar
指向的内容,因此您没有将有效的环境字符串指针交给freenvironmentstring
函数
在修改之前将原始的environVar
保存在某个地方,并在Free
调用中使用它
TCHAR* tobefreeed = GetEnvironmentStrings();
TCHAR* environVar = tobefreeed;
...
FreeEnvironmentStrings( tobefreeed );
跳过保留字符后,
environVar
不再指向由GetEnvironmentStrings
分配的数据区域。这会导致FreeEnvironmentStrings
失败
保留原始指针不变(如果需要,请修改副本),您就可以解决问题。跳过保留字符后,
environVar
不再指向由GetEnvironmentStrings
分配的数据区域。这会导致FreeEnvironmentStrings
失败
保留原始指针不变(如果需要,请修改副本),您将解决问题。谢谢:),我有点不确定为什么在字符数组末尾添加额外的空字符会使其在释放时无效?例如说
GetEnvironmentString
返回地址0x1234ABCD
。确切的地址就是需要提供给FreeEnvironmentString
的地址。在您的代码中(在if
块中),您执行environVar=++pos代码>之后,environVar
不再是0x1234ABCD
。因此,您不能再将environVar
赋予Free*
函数了。谢谢:),我有点不确定为什么在字符数组末尾添加&额外的空字符会使它在我释放它时无效?比如说GetEnvironmentString
返回地址0x1234ABCD
。确切的地址就是需要提供给FreeEnvironmentString
的地址。在您的代码中(在if
块中),您执行environVar=++pos代码>之后,environVar
不再是0x1234ABCD
。因此,您不能再将environVar
赋予Free*
函数。