- c++ new, 应该使用char * p = new(std::nothrow) char[1024];
if(p == nullptr)
{...}
否则内存分配失败时,会抛异常,而非返回空
- 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),那么系统自动转换到空指针调用上面了,这个不会导致编译器报错
- vs2010中,关于预编译头文件
项目里面的设置默认是给所有为单独设定的文件进行设定的。比如a.cpp “使用预编译头文件”
如果项目默认是不使用,那么a.cpp就是单独使用预编译头文件。如果此时你没有定义stdafx.cpp,你应该定义一个stdafx.cpp,stdafx.h,并指定stdafx.cpp为 “创建预编译头文件”(否则你编译会说找不到.pch文件),虽然没有测试,但是我觉得预编译头文件应该可以用其他名字,但是必须保证有一个是用来创建预编译头文件的,其他的用来使用。
一旦你对一个目录下的cpp使用了预编译头文件,那么,即使这个cpp不在stdafx.h同一个目录下面,编译也不会提示你找不到头文件,因为只要你项目有.pch,这个cpp就会找到相应信息。
- windbg 的 分析dmp文件的命令:
!analyze -v
- 关于帮助异常定位
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; 等等