Articles of crt

Windows的mallocreplace(例如,tcmalloc)和dynamic的crt链接

一个使用多个DLL和QT的C ++程序应该配备一个mallocreplace(如tcmalloc ),用于解决可由Windows malloc导致的性能问题。 有了linux,没有问题,但是使用windows,有几种方法,我觉得它们都没有吸引力: 1.将新的malloc放在lib中,并确保先链接(其他SO-问题) 这有一个缺点,例如, strdup仍然会使用旧的malloc,而且免费的可能会导致程序崩溃 。 2.使用lib.exe(Chrome)从静态libcrt库中删除malloc 这是铬/铬testing/使用(?),但有缺点,它只是与静态链接crt的作品。 静态链接有问题,如果一个系统库与msvcrtdynamic链接可能会在堆分配/取消分配不匹配 。 如果我的理解正确,tcmalloc可以被dynamic地链接起来,以便所有自编译的dll(这是很好的)有一个共同的堆。 3.补丁crt源代码(firefox) Firefox的jemalloc显然修补了Windows CRT源代码,并构build了一个新的crt。 这又是上面的静态/dynamic链接问题。 有人可能会想到使用它来生成一个dynamic的MSVCRT,但我认为这是不可能的,因为许可证禁止提供一个打补丁MSVCRT同名。 4.在运行时dynamic修补加载的CRT 一些商业内存分配器可以做这样的魔术。 tcmalloc也可以,但是这看起来相当难看。 它有一些问题,但他们已经修复。 目前,使用tcmalloc它不能在64位窗口下工作。 有更好的方法吗? 任何意见?

Windows应用程序可以写入到C ++的控制台?

我想有一个Windows应用程序具有以下行为: 1.如果它是从现有的命令行窗口(cmd.exe)启动的,则将其stdout写入该控制台。 2.如果通过双击图标启动它,它不会打开一个新的控制台,也不会在任何地方写入它的stdout。 为了达到1,我可以将/SUBSYSTEM链接器参数设置为CONSOLE但是如果我双击应用程序图标,就会打开一个新的控制台窗口。 为了达到2,我将相同的参数设置为WINDOWS ,但是如果从控制台启动应用程序,则其标准输出不会定向到控制台。 我想同一个可执行文件具有这两种行为。 到目前为止,我发现我可以创build一个/SUBSYSTEM:WINDOWS可执行文件,并执行此操作: DWORD ret = AttachConsole(ATTACH_PARENT_PROCESS) if (ret != 0) { // succeeds only if the parent is cmd.exe HANDLE outh = GetStdHandle(STD_OUTPUT_HANDLE); WriteFile(outh, "Hello", 5, NULL, NULL); } 如果进程是从一个进程启动的,那么这会将Hello写入控制台,否则就不会执行任何操作 现在只是把CRT拿出outh作为标准输出的句柄。 我怎样才能做到这一点? 此选项的另一个问题是cmd.exe在启动的进程上未被阻止。 一旦新进程启动,cmd.exe就会回到提示符处,并在出现提示符后出现Hellostring。 如果用户在控制台上按Enter键,则会出现另一个提示。 任何想法如何防止呢?

fopen怎么比fopen更安全?

我正在处理Windows平台的遗留代码。 当我在VS2013编译代码时,会发出以下警告: “错误C4996:' fopen ':这个函数或variables可能是不安全的,请考虑使用fopen_s来取消弃用,请使用_CRT_SECURE_NO_WARNINGS。有关详细信息,请参阅联机帮助。 而且它也会给sprintf惊人的警告。 我明白,由于缓冲区溢出, sprintf_s比sprintf更安全。 但是怎样才能比fopen更安全,因为fopen不接受缓冲区,没有缓冲区溢出的机会。 任何人都可以提供一个案件fopen是不安全的, fopen_s是安全的?

validation库(.lib)中使用的CRT

如何检查Windows中的静态库(.lib)所链接的运行时库? 我正在用/ MDd编译我的项目,我假设我正在链接到一个库正在使用/ MTdmultithreadingdebugging Error 7 error LNK2005: "public: __thiscall std::_Lockit::~_Lockit(void)" (??1_Lockit@std@@QAE@XZ) already defined in libcpmtd.lib(xlock.obj) C:\…\msvcprtd.lib(MSVCP100D.dll) LIBCPMTD.LIB =multithreading,静态链接 我知道有一个选项/NODEFAULTLIB:"libcpmtd.lib" ,我试过并成功了,但我宁愿避免这种情况。

由于MSVCR110.dll,MS Visual Studio 2012最终无法启动

当我尝试运行MVS 2012时,我总是得到一个错误 – 入口点过程_crtCreateSymbolicLinkW在库DLL MSVCR110.dll中找不到。 我已经从我的另一台计算机上复制这个DLL文件,一切正常,但它并没有帮助0_o。 操作系统 – Windows 7。

过程边界的CRTtypes

我正在拖放一个activeX控件。 在拖动,我提供了一个CComQIPtr有COM方法实现传递信息到放置目标。 拖放时,放置目标的进程调用我的COM方法来获取信息。 我不允许在接口边界附近使用CRTtypes或指向CRTtypes的指针吗? 我喜欢我的IDataObject有一个私人的std ::列表和一些std ::string,并在接口的外部能够调用我的COM方法,可以访问这些私人成员。 我认为这是可以的,因为我并没有真正将 CRTtypes通过边界。 MSDN:跨越DLL边界传递CRT对象的潜在错误