Windows HeapFree,msvcrt free:它们是否会释放被释放的内存?我试图估计如果不在退出时释放内存将显着加快应用程序关闭.
注意:这是一个非常具体的技术问题.这不是应用程序应该或不应该free
在退出时调用.
当通过LoadLibrary加载外部DLL(不在我们的控制之下)时,我们遇到的问题是这些DLL中的静态链接CRT无法分配光纤本地存储.这类似于mskb 193462,除了这是FLS并且只有128个.
有没有有用的方法来解决这个问题?CRT正在使用GetProcAddress来查找FlsAlloc(因为这显然从未在XP中存在过),所以它甚至真的需要它吗?
(这是在Vista上,其中FlsAlloc实际存在; DLL似乎使用MSVC8)
我有一个朋友正在接管我的Visual C++项目并且无法运行它.它是一个图形应用程序,它使用Qt GUI库.我提到这个的原因是因为下面的错误.
他可以使用Visual Studio 2010构建和链接程序,但是当他运行它时,此消息会出现在事件查看器中:
"D:\ Test\Qt\4.2.2\bin\QtGuid4.dll"的激活上下文生成失败.相关大会Microsoft.VC80.DebugCRT,ProcessorArchitecture用于= "86",公钥= "1fc8b3b9a1e18e3b",键入= "win32的" 版本= "8.0.50608.0" 无法被发现.请使用sxstrace.exe进行详细诊断.
当我们按照消息要求并运行sxstrace.exe时,我们看到的是:
开始激活上下文生成.输入参数:标志= 0 ProcessorArchitecture用于= WOW32 CultureFallBacks = EN-US; EN ManifestPath = d:\测试\的Qt\4.2.2\BIN\QtGuid4.dll AssemblyDirectory = d:\测试\的Qt\4.2.2\BIN \
---------------信息:解析清单文件D:\ Test\Qt\4.2.2\bin\QtGuid4.dll.信息:清单定义标识是(null).INFO:参考:Microsoft.VC80.DebugCRT,ProcessorArchitecture用于= "86" 类型= "Win32的",版本= "8.0.50608.0" INFO:解决参考Microsoft.VC80.DebugCRT,ProcessorArchitecture用于= "86" "的win32",版本=" 8.0.50608.0" .信息:解决ProcessorArchitecture WOW64的参考.信息:解决文化中立的参考.信息:应用绑定策略.信息:未找到发布者政策.信息:找不到绑定策略重定向.信息:开始装配探测.信息:没有在WinSxS中找到程序集.INFO:尝试在C到探测清单:\ WINDOWS \装配\ GAC_32\Microsoft.VC80.DebugCRT\8.0.50608.0__1fc8b3b9a1e18e3b\Microsoft.VC80.DebugCRT.DLL.信息:没有找到文化中立的清单.信息:结束装配探测.信息:解析ProcessorArchitecture x86的参考.信息:解决文化中立的参考.信息:应用绑定策略.信息:未找到发布者政策.信息:找不到绑定策略重定向.信息:开始装配探测.信息:没有在WinSxS中找到程序集.信息:尝试在C:\ Windows\assembly\GAC_32\Microsoft.VC80.DebugCRT\8.0.50608.0__1fc8b3b9a1e18e3b\Microsoft.VC80.DebugCRT.DLL中探测清单.信息:尝试在D:\ Test\Qt\4.2.2\bin\Microsoft.VC80.DebugCRT.DLL中探测清单.信息:尝试在D:\ Test\Qt\4.2.2\bin\Microsoft.VC80.DebugCRT.MANIFEST中探测清单.信息:尝试在D:\ Test\Qt\4.2.2\bin\Microsoft.VC80.DebugCRT\Microsoft.VC80.DebugCRT.DLL中探测清单.信息:尝试在D:\ Test\Qt\4.2.2\bin\Microsoft.VC80.DebugCRT\Microsoft.VC80.DebugCRT.MANIFEST中探测清单.信息:没有找到文化中立的清单.信息:结束装配探测.错误:无法解析引用Microsoft.VC80.DebugCRT,processorArchitecture ="x86",publicKeyToken ="1fc8b3b9a1e18e3b",type ="win32",version ="8.0.50608.0".
对不起该消息的长度,但我认为它可能会慢慢记忆.这是他没有Visual C++ 2005(我相信VC80来自哪里)C运行时库的情况吗?如果是这样,他可以下载VC++再分发包并安装它,那么一切顺利吗?或者这是一个完全不同的问题?
我有一个C++代码库已经工作了很长时间.代码库是我最近迁移到VS 2008的遗留VS 2003项目集.迁移似乎是成功的,因为生成并运行了生成的程序.
我在新驱动器上重新安装了我的操作系统和所有应用程序,现在当我尝试在调试器中调试程序时,我在CRT内部收到一个断言错误chsize
(真的,_chsize_s
).具体而言(裁剪为必需品,忽略安全检查):
FILE * testfile = fopen("P:\\_Dan\\local\\foogoo.txt", "w");
int filehandle = fileno(testfile);
chsize(filehandle, 0);
fwrite("goohoo", 1, 6, testfile);
fclose(testfile);
Run Code Online (Sandbox Code Playgroud)
调试断言发生在chsize
- 特别是在CRT的源代码文件chsize.c中,位于以下行:
_VALIDATE_CLEAR_OSSERR_RETURN_ERRCODE((_osfile(filedes) & FOPEN), EBADF);
Run Code Online (Sandbox Code Playgroud)
......哪里filedes
比赛filehandle
.
我想可能问题可能是因为没有在新系统上安装旧版本的VS(仅限VS 2008),因为一些第三方库需要VS 8.0可再发行 - 即使在旧系统上似乎正在构建和运行使用VS 2008就好了.因此我安装了VS 2005(而非2003).但是,问题仍然存在.
任何建议都会受到极大的欢迎.
*更新 - 问题与此无关chsize
.请参阅下面的答案.
我在哪里可以找到msvcrtd.dll
(调试 CRT),对应\WinDDK\7600.16385.1\lib\Crt\i386\msvcrtd.lib
于Windows驱动程序工具包?
我正在学习VC++,但我想知道为什么最终用户也需要MSVC++?
据我所知,在MSDN中,如果不是我的程序使用的所有库(实际的DLL文件)已经附带系统本身(user32.dll,kernel32.dll等).
但是Paint和Notepad怎么不需要MSVC++,但是我的软件比Notepad更简单需要这个运行时?运行时有什么作用?它是如何工作的?有没有办法让我的软件在没有MSVC++的情况下工作?
在VS2012的静态链接版本中似乎存在问题.在旧系统上启动控制台应用程序会导致异常,无论何时使用流,尽管新系统根本不会造成任何问题.要重现此错误,就足够了
std::ofstream f;
或std::cout << "Hello World";
在主函数中(根据需要包括fstream或iostream)使用ofstream或cout删除行总能解决问题.切换到动态链接的运行时库(/ MD)始终可以解决问题.在ofstream的情况下,使用大小优化(/ O1)或没有优化(/ Od)而不是速度优化(/ O2)解决了问题.
有没有人有想法或提示?提前致谢.
CRT函数atexit()
可以在main
函数返回后注册一个函数来运行.我想知道使用它的典型场景是什么?是(atexit
)真的有必要吗?
我正在尝试自己编译Microsoft CRT 11(与VS2012一起提供的版本).
我知道在VS2008之前,这个动作完全由微软支持:
http://msdn.microsoft.com/en-us/library/k9a8ehy3(v=vs.90).aspx
但是自从VS2010以来你不应该再这样做了,我知道风险(主要是 - 编译错误,并且遇到无法解决或解决的问题)
我使用VS附带的以下目录作为输入代码和头文件:
Code:
C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\crt\src
Headers:
C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\include
C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Include
C:\Program Files (x86)\Windows Kits\8.0\Include\shared
C:\Program Files (x86)\Windows Kits\8.0\Include\um
C:\Program Files (x86)\Windows Kits\8.0\Include\WinRT
Run Code Online (Sandbox Code Playgroud)
(到目前为止,我所做的唯一更改是从项目中删除一些MSIL源)
大多数代码已经编译.但我无法编译该文件
C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\crt\src\assert.c
Run Code Online (Sandbox Code Playgroud)
由于错误:
error C3861: '_ReturnAddress': identifier not found
Run Code Online (Sandbox Code Playgroud)
如果我加
#include <intrin.h>
Run Code Online (Sandbox Code Playgroud)
它解决了.但我认为如果不直接更改代码,它应该可以解决.
当然,我经常面临新的挑战.但我认为当前的解决方案是修复头目录的包含顺序.使用头目录的顺序是什么?
序言:这个问题特别关注动态 CRT 的行为,并且仅与之相关/MD
.它并不质疑任何其他建议的有效性.DllMain
.
当我们被告知:(参考:动态链接库的最佳实践,MSDN,2006年5月17日)
您永远不应该在DllMain中执行以下任务:
- ...
- 使用动态 C运行时(CRT)中的内存管理功能.如果未初始化CRT DLL,则对这些函数的调用可能导致进程崩溃.
- ...
其他人已经对此提出质疑(如:质疑论证的有效性),既然我们在那里得到了答案,我们可以清楚地看到一个相当简单的案例,这可能会引起麻烦:
您正在假设DLL的入口点始终是_DllMainCRTStartup.情况并非如此,它只是链接器的默认值.它可以是程序员想要的任何东西,使用链接器的/ ENTRYPOINT选项可以快速轻松地更改.微软没有办法阻止这一点.
所以这些是这个问题的要素:
链接和不提供自定义时是否还有其他情况,动态 CRT应该不能完全初始化?/MD
/ENTRYPOINT
LoadLibrary
调用,只需链接时间DLL依赖项.额外:MS文档专门调用"内存管理功能",但据我所知,如果CRT未初始化,可能任何 CRT功能都应该是不安全的.为什么以这种方式调用内存管理功能?
三:
WRT.对于习惯ENTRYPOINT
:我不太明白这是一个如此重要的场景,它需要被包含在不做DllMain列表中而无需进一步限定.IFF我提供了一个自定义入口点,我负责正确初始化CRT,或者CRT在我的程序中的任何地方都不能正常工作,而不仅仅是DllMain.为什么要专门调用DllMain部分?
这导致我回到Q.1,即如果这是动态 CRT 存在问题的唯一情况.澄清或大开眼界为什么这对于DllMain来说更重要的是,对于DLL的其他部分,或者我可能会错过这里,我们将不胜感激.
额外链接:
理由:我觉得我应该为上下文添加这个:我问这个是因为我们有大量的代码通过全局C++对象构造函数来做事.实际上破坏的事情多年来一直经过审查(如并发LoadLibrary
,线程同步等),但所有代码都充满了std
C++和CRT功能,这些功能已经在Windows XP,7和Windows 10上运行多年了任何已知的打嗝.虽然我不是一个哭泣"但它只是有效",我必须在这里做一个工程判断,试图"修复"这个是否有任何短期到中等价值.因此,如果肥皂盒的答案可以留在他们的盒子里,我将不胜感激.