Tips:
1 建议new,delete,而不是malloc,free
2 new要判断返回值,经常成功不代表一定成功
3 使用new动态分配内存:若没有足够内存,则new返回0(空值指针null pointer);
4 不要使用delete释放不是new分配的内存,delete释放指针指向的内存,但不会删除指针本身;
5 delete指针后尽量赋值NULL
6 new分配一块内存的时候,并没有对这块内存空间做清零等任何动作,delete同样
7 对空值指针应用delete是安全的;
1 建议new,delete,而不是malloc,free
2 new要判断返回值,经常成功不代表一定成功
3 使用new动态分配内存:若没有足够内存,则new返回0(空值指针null pointer);
4 不要使用delete释放不是new分配的内存,delete释放指针指向的内存,但不会删除指针本身;
5 delete指针后尽量赋值NULL
6 new分配一块内存的时候,并没有对这块内存空间做清零等任何动作,delete同样
7 对空值指针应用delete是安全的;
8 创建数组时的静态联编与动态联编:数组声名int a[10], 静态联编,数组的长度在编译时确定;用new[]创建数组,动态联编,运行时为数组分配内存空间。动态-运行时分配内存。
深入new
当我们使用关键字new在堆上动态创建一个对象时,它实际上做了三件事:获得一块内存空间、调用构造函数、返回正确的指针。
class A
{
int i;
public:
A(int _i) :i(_i*_i) {}
void Say() { printf("i=%dn", i); }
};
//调用new:
A* pa = new A(3);
{
int i;
public:
A(int _i) :i(_i*_i) {}
void Say() { printf("i=%dn", i); }
};
//调用new:
A* pa = new A(3);
那么上述动态创建一个对象的过程大致相当于以下三句话(只是大致上):
A* pa = (A*)malloc(sizeof(A));
pa->A::A(3);
return pa;
虽然从效果上看,这三句话也得到了一个有效的指向堆上的A对象的指针pa,但区别在于,当malloc失败时,它不会调用分配内存失败处理程序new_handler,而使用new的话会的。因此我们还是要尽可能的使用new,除非有一些特殊的需求。
pa->A::A(3);
return pa;
虽然从效果上看,这三句话也得到了一个有效的指向堆上的A对象的指针pa,但区别在于,当malloc失败时,它不会调用分配内存失败处理程序new_handler,而使用new的话会的。因此我们还是要尽可能的使用new,除非有一些特殊的需求。