问题标签 [crt]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 卸载 DLL 时的内存泄漏是否会导致主机进程泄漏?
考虑这种情况:
此时,调用 malloc() 时分配的 1k 是否会再次可供宿主进程使用?DLL 静态链接到 CRT。
multithreading - _nolock CRT 函数
我最近发现了_nolock 函数的存在,我很惊讶我在这些方面能找到这么少的信息。它说它提高了性能,但我找不到任何基准。它还说,如果程序自己锁定,它们可以在多线程程序中使用,但是必须锁定什么?所有 CRT 调用都应该通过同一个锁吗?每个功能一个?每组功能一个?如果是这样,什么定义了组?
您能否指出有关这些功能的一些详细信息?谢谢 :-)
c - 初学者的 scanf_s() 残疾
我知道 scanf_s() 有一些奇怪的地方,但我无法解决这个问题。我的代码通过使用 scanf() 运行良好,但这不会反转数组的元素:( 任何帮助将不胜感激。谢谢。
c - 如何在不使用 WinMain 的情况下编写 Windows 应用程序?
用 C/C++ 编写的 Windows GUI 应用程序将“WinMain”作为入口点(而不是“main”)。我对此的理解是编译器会生成一个由 C 运行时调用的“主”函数。这个'main'函数为GUI设置必要的环境并调用'WinMain'(指定实例句柄等)。
简而言之,我相信控制台和 GUI 应用程序启动在以下方面有所不同:
控制台应用程序:C 运行时 --> 'main' 函数(手工编码)
GUI 应用程序:C 运行时 --> 'main' 函数(编译器生成) --> 'WinMain' 函数(手工编码)
我想验证这种理解并找出我如何仅使用“main”函数(即无需编写“WinMain”)手动编写 Windows GUI。
visual-c++ - VC90 调试 CRT 错误
我在 VC++ 2008 中创建了一个 Dll。但它正在与其他一些软件 (VB) 一起使用。无法在 Labview 中加载该 dll 函数。VC90 Debug CRT 错误来了。为什么这个软件不支持我的dll?
c++ - 如何使用 Visual Studio 2008 构建在普通旧 XP SP2 上运行且没有并行 DLL 的 C++ 应用程序?
我想通过一次调用来编译一个 C++ 项目,WinExec
以便使用一些命令行参数启动另一个可执行文件。我不知道在我的项目中要指定哪些设置才能生成不需要 Microsoft 并行 DLL 的可执行文件,我不想在我的目标系统上安装它。有什么提示吗?
症状是应用程序无法启动并且以下事件被写入应用程序日志(免费翻译自法语):
更新:我知道使用WinExec
是不好的做法,但它就像一个魅力,微软不可能在任何未来的 API 版本中删除它,不是吗?
c - 如何在进入 VC 中的 main() 例程之前执行一些代码?
我正在阅读微软的 CRT 源代码,我可以想出以下代码,其中函数 __initstdio1 将在 main() 例程之前执行。
问题是,如何在进入 VC 中的 main() 例程之前执行一些代码(不是 VC++ 代码)?
输出将是:
但是,我无法理解代码。
我在 .CRT$XIC 上做了一些谷歌搜索,但没有找到运气。一些专家可以向我解释上面的代码段,特别是以下内容:
- 这条线
_CRTALLOC(".CRT$XIC") static pinit = __initstdio1;
是什么意思?变量pinit的意义是什么? - 在编译期间,编译器 (cl.exe) 会抛出如下警告:
Microsoft (R) 32 位 C/C++ 优化编译器版本 15.00.30729.01,适用于 80x86 版权所有 (C) Microsoft Corporation。版权所有。
需要采取哪些纠正措施来删除警告消息?
提前致谢。
添加:
我已经修改了代码并将 pinit 的类型指定为 _PIFV。现在警告信息消失了。
新代码如下:
c++ - 我应该用 /MD 还是 /MT 编译?
在 Visual Studio 中,有编译标志 /MD 和 /MT 可让您选择所需的 C 运行时库。
我理解实现上的差异,但我仍然不确定使用哪一个。有什么优点/缺点?
我听说 /MD 的一个优点是,它允许某人更新运行时,(比如可能修补安全问题)并且我的应用程序将从这次更新中受益。尽管对我来说,这似乎是一个非功能:我不希望人们在不让我针对新版本进行测试的情况下更改我的运行时!
我很好奇的一些事情:
- 这将如何影响构建时间?(大概 /MT 有点慢?)
- 其他影响是什么?
- 大多数人使用哪一种?
msvcrt - 我应该静态还是动态链接到 Visual Studio C 运行时?
我已经阅读了双方关于是否应该在 Visual Studio 项目中静态或动态链接到 C 运行时库的争论,但我仍然不完全确定该怎么想。
我的项目引入了一些第三方库(Python、HDF5、Trilinos 和 Microsoft MPI),每个库都必须使用与我的最终可执行文件相同的运行时库构建(否则它们无法链接在一起)。静态链接时,这些库中的每一个都将包含 C 运行时的副本。我读到这可能会导致问题,因为最终的可执行文件将包含运行时的多个副本,它们都不能相互交互。但是如果相同的符号被多次定义,链接器不会抱怨吗?
我想避免“DLL Hell”,但我担心在运行时的多个副本中静态链接可能产生的潜在错误。我读错了吗?
此外,我使用的是 Visual Studio 2005,并且我读到 Service Pack 1 运行时不向后兼容。这是否意味着没有 SP1 构建的应用程序将无法在具有 SP1 dll 的机器上运行,即使它们具有相同的名称(例如 msvcr80.dll)?
windows - Windows malloc 替换(例如 tcmalloc)和动态 crt 链接
使用多个 DLL 和 QT 的 C++ 程序应配备 malloc 替代品(如tcmalloc),以解决可验证为由 Windows malloc 引起的性能问题。使用 linux,没有问题,但是使用 windows,有几种方法,我发现它们都不吸引人:
1.将新的malloc放入lib并确保首先链接它(其他SO问题)
这有一个缺点,例如strdup 仍将使用旧的 malloc 并且 free 可能会使程序崩溃。
2. 使用 lib.exe (Chrome) 从静态 libcrt 库中删除 malloc
这已针对chrome/chromium进行了测试/使用(?),但缺点是它仅适用于静态链接 crt。如果一个系统库与 msvcrt 动态链接,则静态链接会出现问题,堆分配/释放中可能存在不匹配。如果我理解正确,tcmalloc 可以动态链接,这样所有自编译的 dll 都有一个公共堆(这很好)。
3.补丁crt-源码(firefox)
Firefox 的 jemalloc显然修补了 windows CRT 源代码并构建了一个新的 crt。这又出现了上面的静态/动态链接问题。
可以考虑使用它来生成动态 MSVCRT,但我认为这是不可能的,因为许可证禁止提供具有相同名称的修补 MSVCRT。
4.在运行时动态修补加载的CRT
一些商业内存分配器可以做到这一点。tcmalloc 也可以,但这看起来相当难看。它有一些问题,但它们已得到修复。目前,使用 tcmalloc 它不能在 64 位窗口下工作。
有更好的方法吗?任何意见?