-1

我升级到最新版本的 VisualStudio 2017 (15.9.5) 来编译我们的原生 C++ 应用程序。但是现在在发布模式下(并且仅在发布中)我收到以下警告(我们将警告视为错误):

...nothing useful...
6>qrc_IceApplication.cpp
6>   Creating library C:/tkbt/Prose/Build/Release/lib/Prose.lib and object  C:/tkbt/Prose/Build/Release/lib/Prose.exp
6>Generating code
6>c:\program files (x86)\microsoft visual studio\2017\community\vc\tools\msvc\14.16.27023\include\functional(1195): error C2220: warning treated as error - no 'executable' file generated
6>c:\program files (x86)\microsoft visual studio\2017\community\vc\tools\msvc\14.16.27023\include\functional(1195): warning C4789: buffer '_Temp' of size 64 bytes will be overrun; 72 bytes will be written starting at offset 8
6>c:\program files (x86)\microsoft visual studio\2017\community\vc\tools\msvc\14.16.27023\include\functional(1195): warning C4789: buffer '_Temp' of size 64 bytes will be overrun; 72 bytes will be written starting at offset 8
6>c:\program files (x86)\microsoft visual studio\2017\community\vc\tools\msvc\14.16.27023\include\functional(1195): warning C4789: buffer '_Temp' of size 64 bytes will be overrun; 72 bytes will be written starting at offset 8
6>c:\program files (x86)\microsoft visual studio\2017\community\vc\tools\msvc\14.16.27023\include\functional(1195): warning C4789: buffer 'DetectPossibilities' of size 64 bytes will be overrun; 72 bytes will be written starting at offset 8
6>c:\program files (x86)\microsoft visual studio\2017\community\vc\tools\msvc\14.16.27023\include\functional(1195): warning C4789: buffer '_Temp' of size 64 bytes will be overrun; 72 bytes will be written starting at offset 8

DetectPossibilities 是唯一与我们的代码有任何关系的东西(_Temp 没有),我能看到的唯一奇怪的是它是自我捕获的

std::function<bool(int)> DetectPossibilities;
DetectPossibilities = [&](int startPos) -> bool { 
   ... lots of code
   bool nestedAnyFound = DetectPossibilities(startPos + ofMatch.capturedLength());
   ... lots of code
};

更新:我找到了一种解决方法和一个合理的解释,所以我将发布 Q 和 A,这样下一个人就不会花费与我相同的半天时间来弄清楚发生了什么。

4

1 回答 1

0

这是我们关于幕后可能发生的事情的理论:

std::function<bool(int)> DetectPossibilities;

编译(在释放模式下)相当于在内存中分配 64 字节。

DetectPossibilities = [&](int startPos) -> bool { 

为它分配一个新的 lambda,这个有一个捕获,这会编译(在释放模式下)72 字节的内存,但不适合内存中的同一位置,因此会发出警告。唯一的区别是捕获。因此,如果我们确保原件也有捕获,那么我们应该能够解决这个奇怪的问题。

  std::function<bool(int)> DetectPossibilities = [&](bool){return 0;};
  DetectPossibilities = [&](int startPos) -> bool {

确实这个链接在发布模式下,避免了那些奇怪的错误。

对我来说,这似乎是 Visual Studio 中的一个错误,因为它不会在调试编译中发生,并且编译器应该具有能够处理该特定模式并正确分配内存的智能。

于 2019-01-10T03:58:53.890 回答