标签: msvcrt

内存释放例程是否触及正在释放的块?

Windows HeapFree,msvcrt free:它们是否会释放被释放的内存?我试图估计如果不在退出时释放内存将显着加快应用程序关闭.

注意:这是一个非常具体的技术问题.这不是应用程序应该或不应该free在退出时调用.

windows free memory-management msvcrt

5
推荐指数
1
解决办法
335
查看次数

使用太多静态链接的CRT解决fls限制?

当通过LoadLibrary加载外部DLL(不在我们的控制之下)时,我们遇到的问题是这些DLL中的静态链接CRT无法分配光纤本地存储.这类似于mskb 193462,除了这是FLS并且只有128个.

有没有有用的方法来解决这个问题?CRT正在使用GetProcAddress来查找FlsAlloc(因为这显然从未在XP中存在过),所以它甚至真的需要它吗?

(这是在Vista上,其中FlsAlloc实际存在; DLL似乎使用MSVC8)

windows multithreading msvcrt

5
推荐指数
1
解决办法
1915
查看次数

Visual C++程序问题 - 无法找到Debug CRT

我有一个朋友正在接管我的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++ msvcrt visual-c++

5
推荐指数
1
解决办法
1万
查看次数

在VS 2008中调用_osfile()的CRT中的断言错误?

我有一个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.请参阅下面的答案.

c++ crt msvcrt visual-studio-2008 visual-studio

5
推荐指数
1
解决办法
3320
查看次数

msvcrtd.dll在哪里?

我在哪里可以找到msvcrtd.dll(调试 CRT),对应\WinDDK\7600.16385.1\lib\Crt\i386\msvcrtd.libWindows驱动程序工具包

winapi wdk msvcrt visual-c++

5
推荐指数
1
解决办法
4425
查看次数

为什么我需要安装MSVC++ redist.

我正在学习VC++,但我想知道为什么最终用户也需要MSVC++?

据我所知,在MSDN中,如果不是我的程序使用的所有库(实际的DLL文件)已经附带系统本身(user32.dll,kernel32.dll等).

但是Paint和Notepad怎么不需要MSVC++,但是我的软件比Notepad更简单需要这个运行时?运行时有什么作用?它是如何工作的?有没有办法让我的软件在没有MSVC++的情况下工作?

winapi msvcrt visual-studio visual-c++

5
推荐指数
1
解决办法
423
查看次数

使用Visual Studio 2012静态链接的msvcrt中的异常

在VS2012的静态链接版本中似乎存在问题.在旧系统上启动控制台应用程序会导致异常,无论何时使用流,尽管新系统根本不会造成任何问题.要重现此错误,就足够了

  • 在VS2012中创建一个新的控制台应用程序
  • 添加行std::ofstream f;std::cout << "Hello World";在主函数中(根据需要包括fstream或iostream)
  • 切换到v110_xp工具集(如果Windows XP需要)
  • 切换到静态链接库(/ MT)
  • 在旧系统上启动exe总是有一个例外.

使用ofstream或cout删除行总能解决问题.切换到动态链接的运行时库(/ MD)始终可以解决问题.在ofstream的情况下,使用大小优化(/ O1)或没有优化(/ Od)而不是速度优化(/ O2)解决了问题.

有没有人有想法或提示?提前致谢.

c++ msvcrt cpu-architecture sse2 visual-studio-2012

5
推荐指数
1
解决办法
456
查看次数

使用atexit功能的场景是什么?

CRT函数atexit()可以在main函数返回后注册一个函数来运行.我想知道使用它的典型场景是什么?是(atexit)真的有必要吗?

c crt msvcrt

5
推荐指数
2
解决办法
1222
查看次数

编译Microsoft CRT 11(msvcrt110.dll) - 包含的正确顺序是什么?

我正在尝试自己编译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)

它解决了.但我认为如果不直接更改代码,它应该可以解决.

当然,我经常面临新的挑战.但我认为当前的解决方案是修复头目录的包含顺序.使用头目录的顺序是什么?

c++ crt msvcrt visual-studio-2010 visual-studio-2012

5
推荐指数
1
解决办法
927
查看次数

在哪种情况下动态CRT在调用用户提供的DllMain时尚未初始化?

序言:这个问题特别关注动态 CRT 的行为,并且仅与之相关/MD.它并不质疑任何其他建议的有效性.DllMain.


我们被告知:(参考:动态链接库的最佳实践,MSDN,2006年5月17日)

您永远不应该在DllMain中执行以下任务:

  • ...
  • 使用动态 C运行时(CRT)中的内存管理功能.如果未初始化CRT DLL,则对这些函数的调用可能导致进程崩溃.
  • ...

其他人已经对此提出质疑(如:质疑论证的有效性),既然我们在那里得到了答案,我们可以清楚地看到一个相当简单的案例,这可能会引起麻烦:

您正在假设DLL的入口点始终是_DllMainCRTStartup.情况并非如此,它只是链接器的默认值.它可以是程序员想要的任何东西,使用链接器的/ ENTRYPOINT选项可以快速轻松地更改.微软没有办法阻止这一点.

所以这些是这个问题的要素:

  • 链接和提供自定义时是否还有其他情况,动态 CRT应该不能完全初始化?/MD/ENTRYPOINT

    • 具体来说,如果所有DLL加载只通过"静态依赖"完成,即根本没有显式LoadLibrary调用,只需链接时间DLL依赖项.
  • 额外:MS文档专门调用"内存管理功能",但据我所知,如果CRT未初始化,可能任何 CRT功能都应该是不安全的.为什么以这种方式调用内存管理功能?

  • 三:

    WRT.对于习惯ENTRYPOINT:我不太明白这是一个如此重要的场景,它需要被包含在不做DllMain列表中而无需进一步限定.IFF我提供了一个自定义入口点,我负责正确初始化CRT,或者CRT在我的程序中的任何地方都不能正常工作,而不仅仅是DllMain.为什么要专门调用DllMain部分?

    这导致我回到Q.1,即如果这是动态 CRT 存在问题的唯一情况.澄清或大开眼界为什么这对于DllMain来说更重要的是,对于DLL的其他部分,或者我可能会错过这里,我们将不胜感激.


额外链接:


理由:我觉得我应该为上下文添加这个:我问这个是因为我们有大量的代码通过全局C++对象构造函数来做事.实际上破坏的事情多年来一直经过审查(如并发LoadLibrary,线程同步等),但所有代码都充满了stdC++和CRT功能,这些功能已经在Windows XP,7和Windows 10上运行多年了任何已知的打嗝.虽然我不是一个哭泣"但它只是有效",我必须在这里做一个工程判断,试图"修复"这个是否有任何短期到中等价值.因此,如果肥皂盒的答案可以留在他们的盒子里,我将不胜感激.

winapi msvcrt visual-c++ dllmain

5
推荐指数
1
解决办法
361
查看次数