Win32释放环境变量导致Windows断点 我有一个Win32 C++应用程序,我把所有的环境变量都存储在一个地图中。

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 &

在我的应用程序中调用Win32函数FreeEnvironmentStrings()时,我在MSVC++中得到一个奇怪的Windows断点。首先,我不知道这意味着什么&为什么会发生

我如何解决我的问题&出了什么问题

这是我在主函数中调用的函数&导致断点的函数:

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*
函数。