我已升级到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,以便下一个人不会花我做同样的半天时间来解决问题上。
答案 0 :(得分:0)
这是我们关于引擎盖下可能发生的情况的理论:
std::function<bool(int)> DetectPossibilities;
在释放模式下编译为相当于在内存中分配64字节的内容。
DetectPossibilities = [&](int startPos) -> bool {
为其分配一个新的lambda,该lambda具有捕获功能,并且可以编译(在释放模式下)72个字节的内存,但不适合内存中的同一位置,因此发出警告。唯一的区别是捕获。因此,如果我们确保原件也具有捕获功能,那么我们应该可以解决这个奇怪的问题。
std::function<bool(int)> DetectPossibilities = [&](bool){return 0;};
DetectPossibilities = [&](int startPos) -> bool {
实际上,此链接处于发布模式,避免了那些奇怪的错误。
在我看来,这就像是Visual Studio中的错误,因为它不是在调试编译中发生的,并且编译器应该具有能够处理该特定模式并正确分配内存的技巧。