存档

  • 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 空指针
    调试版的 delete

    msvcp80[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 程序开发
  • 查看 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 管理与应用
  • 标准库串流 stringstream 提取字符串数据片段

    标准库中有两种串流:
    <strstream> 中的 istrstream、ostrstream 类,以及合并类 strstream,它们配合 C 风格的字符串(字符数组,而且字符一定是 char,不支持 wchar_t)
    <sstream> 中的 basic_istringstream、basic_ostringstream 类模板,以及合并类模板 basic_stringstream,它们配合标准库中串模板 basic_string,所以 char,wchar_t 都是支持的。
    代码片段如下:

    #include <string>
    #include <sstream>

    _tistringstream iss;
    _tstring strbuf;
    int ival = 0;

    strbuf = "123abc";

    // 注意 clear() 的使用,需要靠它来清除上回提取(>>)
    // 或其它流操作时导致的错误状态(串流的状态位)
    iss.clear();

    iss.str(strbuf);
    iss >> ival;

    注意:要想多次使用一个 istringstream 对象多次从 string 中提取数据,则用 clear() 复位流状态是必需的,因为当 istringstream 在提取数据时,如果走完了整个关联的 string,则这时的状态为 EOF(流的 end of file 状态),这时再用该流做提取 >> 操作时就不会作用,因为 EOF 和流错误一样不让流继续工作,除非 clear() 状态。看看下面例子:

    std::string one = "1";
    std::string two [...]

    2010年3月17日 | 归档于 C/C++ 标准库
‘C/C++ 标准库’ 分类的存档