内存管理
- 使用new申请内存,使用delete释放内存。
//C++:
int *p = new int;
delete p;
int *arr = new int[100]; //申请块内存
delete []arr;
//如果写成delete arr,则只能删除第一个内存,后面99个内存还在。
//c语言:
void *malloc(size_t size); //申请内存
void free(void *memblock); //释放内存
申请和释放内存配套,不可混用。
2. 申请内存需要判断是否成功
int *p = new int;
if(NULL == p){
//内存分配失败
//异常处理
}
const常量
使用const比宏定义define好,因为编译时const会检查变量类型,不易出错。
另外:
const int *p;
int const *p; //二者等价
下面记录C++Primer中提到的一个问题:
假设给出以下语句:
typedef string *pstring;
const pstring cstr;
请问cstr变量是什么类型?
答案是const string类型的指针。
那const pstring指针所表示的真实类型是什么?
const修饰的是pstring,而pstring是一个指针,所以等价为:
string *const cstr; //指向string类型对象的const指针
//下面这个等价是错误的
const string *cstr;
引用
int a = 3;
int &b = a;
b = 10; //b是a的别名,改变b相当于改变a
别名和指针的比较
引用和指针都可以间接访问另一个值,但是它们之间有两个重要区别:
- 定义引用时必须初始化,而指针初始化不是必要的(但是注意,未初始化的指针不要用于解引用*,即不要对该指针进行存、取值等操作)
- 给引用赋值修改的是与该引用关联的对象的值,而不是该引用与另一个对象的关联,引用一旦初始化就始终指向特定的对象。
//指针赋值
int ival = 1024,ival2 = 2048;
int *pi = &ival, *pi2 = &ival2;
pi = pi2; //指针pi指向了ival2
//引用赋值
int &r1 = ival, &r2 = ival2;
r1 = r2; //引用关联的对象没变,ival的值变成了ival2的值