存档
-
VC 运行时库中的 new/delete 使用
目录
缘起
CRT 的动态链接模块使用 msvcr[ver].dll 导出的 new
头文件和模块 msvcr80[d].dll 中 new/delete 的对应
标量 new 与矢量 new[]
放置式 new
no-throw 的 new
调试版的 new
new 申请内存失败
std::set_new_handler 和 _set_new_handler使用 msvcr[ver].dll 导出的 delete
delete 和 delete[]
两次重复 delete
delete 空指针
调试版的 deletemsvcp80[d].dll 导出的 new/delete
总结
参考缘起
我用 dependency walker(简称 depends)跟了一下,发现 operator new/delete 函数是从 msvcr[ver].dll 中导出的(如图),其中 ver 是 VC 运行时库(CRT)的版本,例如:VC 2005(简称 VC8)环境下,Release 版本为 80,Debug 版本为 80d。本以为 operator new/delete 是从另一个 msvcp[ver].dll 导出的,其实不是,msvcp[ver].dll 有自己导出的 operator new/delete,但并不是我们编程常规用的 [...]2010年6月5日 | 归档于 C/C++ 标准库, Windows 程序开发 -
VC 的预定义宏 MSDN 参考
转存 VC 的预定义宏(Predefined Macros)的 MSDN 参考。这些预定义宏在 VC 的编译器 cl 中产生(可用 /D 选项定义新的宏),或是在 MS 的 C/C++ 标准库/RT 库的头文件中定义,多半的作用是编译或运行时环境的判定,其中有些是标准 C/C++ 规范规定的,比如:
__cplusplus,__DATE__,__FILE__,__LINE__ 等。
有些是 cl 和 MS C/C++ RT 特定的,比如:_MSC_VER。例如这样使用 _MSC_VER,判定 cl 编译环境的版本: -
查看 glibc 的版本
执行 libc.so.6
要查看 Linux 下安装的 glibc 版本,可以直接运行 /lib/libc.so.6 类似命令,它会输出 glibc 的版本、生成它所使用的 gcc 的版本等,/lib/libc.so.6 本身是一个到 /lib/libc-[ver].so 的符号链接,截止 2009-12 最近的稳定版 glibc 的版本是 2.11。
查看 ldd 的版本
使用和 glibc 库共同安装的 ldd,打印它的版本就是 glibc 的版本:ldd --version。在 Cygwin 下这个不顶用,Cygwin 的 ldd 是基于 cygwin1.dll 的。
调用 gnu_get_libc_version() 函数
也可以自己写个简单的程序,调用 gnu_get_libc_version() 函数输出版本号,例如:#include <stdio.h>
#include <gnu/libc-version.h>int main()
{
puts(gnu_get_libc_version());
return 0;
}2010年3月26日 | 归档于 C/C++ 标准库, Linux 管理与应用