【问题标题】:Win32 Releasing Environment Variables causes Windows BreakpointWin32 释放环境变量导致 Windows 断点
【发布时间】:2011-09-22 21:23:06
【问题描述】:

我有一个 win32 c++ 应用程序,我获取了所有环境变量并将它们存储在地图中。

当我在我的应用程序中调用 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;       
}    

【问题讨论】:

    标签: c++ winapi environment-variables


    【解决方案1】:

    您正在更改 environVar 指向的内容,因此您没有将有效的环境字符串指针交给 FreeEnvironmentString 函数。

    在修改之前将原始 environVar 保存在某处,并在 Free 调用中使用它。

    TCHAR* tobefreeed = GetEnvironmentStrings();
    TCHAR* environVar = tobefreeed;
    ...
    FreeEnvironmentStrings( tobefreeed );
    

    【讨论】:

    • 谢谢 :),我有点不确定为什么在 char 数组末尾添加 & 额外的 NULL 字符会使其在释放时无效?
    • 比如说GetEnvironmentString返回地址0x1234ABCD。这个确切的地址需要提供给FreeEnvironmentString。在您的代码中(在if 块中),您之后执行environVar = ++pos;environVar 不再是0x1234ABCD。所以你不能再把environVarFree* 函数。
    【解决方案2】:

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

    保持原始指针完好无损(如果需要,修改副本),您将解决问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-04-15
      • 1970-01-01
      • 2010-11-03
      • 1970-01-01
      • 1970-01-01
      • 2015-08-20
      • 1970-01-01
      相关资源
      最近更新 更多