Win32释放环境变量导致Windows断点

时间:2011-06-26 07:45:40

标签: c++ winapi environment-variables

我有一个win32 c ++应用程序&我得到了所有环境变量&将它们存储在地图中。

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

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

这是我在主要功能和功能中调用的功能。导致断点的那个:

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;       
}    

2 个答案:

答案 0 :(得分:3)

您正在更改environVar指向的内容,因此您不会将FreeEnvironmentString函数作为有效的环境字符串指针处理。

在修改原始environVar之前保存原始Free并在TCHAR* tobefreeed = GetEnvironmentStrings(); TCHAR* environVar = tobefreeed; ... FreeEnvironmentStrings( tobefreeed ); 调用中使用它。

{{1}}

答案 1 :(得分:1)

跳过保留字符environVar后,不再指向由GetEnvironmentStrings分配的数据区域。这会导致FreeEnvironmentStrings失败。

保留原始指针(如果需要,可以修改副本),您将解决问题。