首页 > 代码库 > 2014-11-24~11-28 工作备忘

2014-11-24~11-28 工作备忘

  1. c++ new, 应该使用char * p = new(std::nothrow) char[1024];

                      if(p == nullptr)

                       {...}

    否则内存分配失败时,会抛异常,而非返回空

  2. nullptr

    c++中最好使用这个代替NULL(通常被定义为 0, 自己也可以重定义),一方面是代码可读性强,标明是指针;另一方面,看如下情况

    函数1的声明 void f(int i, int* p);

    函数2的声明 void f(int i, int p);

    那么你调用 f(4, NULL)可能是希望调用第1个函数,但是悲催的,你调用了第2个。那么定义

    #define NULL ((void*)0)不行吗? 答案是不行,c++不允许void *变量赋值给其他类型的指针(反之可以)

    另外,如果你使用了模板可能会导致编译报错。比如

    void test(std::pair<int*, int> p);的函数,如果你调用了test(std::make_pair<NULL, 4>)编译器会报错。当然,函数是可以转换的如果定义了

    test(int *p);调用了test(0)或者test(NULL),那么系统自动转换到空指针调用上面了,这个不会导致编译器报错

  3. vs2010中,关于预编译头文件

    项目里面的设置默认是给所有为单独设定的文件进行设定的。比如a.cpp “使用预编译头文件”

    如果项目默认是不使用,那么a.cpp就是单独使用预编译头文件。如果此时你没有定义stdafx.cpp,你应该定义一个stdafx.cpp,stdafx.h,并指定stdafx.cpp为 “创建预编译头文件”(否则你编译会说找不到.pch文件),虽然没有测试,但是我觉得预编译头文件应该可以用其他名字,但是必须保证有一个是用来创建预编译头文件的,其他的用来使用。

    一旦你对一个目录下的cpp使用了预编译头文件,那么,即使这个cpp不在stdafx.h同一个目录下面,编译也不会提示你找不到头文件,因为只要你项目有.pch,这个cpp就会找到相应信息。

  4. windbg 的 分析dmp文件的命令:

    !analyze -v

  5. 关于帮助异常定位

throw一个整数(特定的)可以定位异常位置
我们可以在自己需要抛出异常的地方,抛出一个特定的整数,便于崩溃时发现异常代码的位置。
比如可以定义
struct EXP_VALUE
{ 
    static const ULONG64 exp_value_offset = 0xa1b2d3e4f9e80000;
    static const ULONG64 exp_value_1 = exp_value_offset + 1;
    static const ULONG64 exp_value_2 = exp_value_offset + 2;
    ...
 };
 ...
 这样,代码中可以这样
 if(p == nullptr)
     throw exp_value_2;
 ...
 
 if(this_p == 7)
    throw_exp_value_1;
 等等

2014-11-24~11-28 工作备忘