标签:编译器 初始化 sizeof 结束 局部变量 内部数据 block 全局变量 c++语言
内存分配方式有如下三种:
一般的原则是:如果使用堆栈和静态存储就能够满足应用需求,就不要使用动态存储。因为,在堆上动态分配内存需要很多额外开销。
如果函数的参数是一个指针,不要使用它去申请一块内存。因为编译器总是为函数的实参制作临时副本,指针p的副本_p值一样,因此指向同一块内存。但是如果使用_p来申请内存,p指向的内存则完全没有改变,反而在函数结束后造成内存的泄漏。
free()和delete只是把指针所指向的内存释放掉,并没有把指针本身删掉,大多数情况下p指向的地址仍不变,变成了“野指针”。
“野指针”有以下的成因
malloc()与free()是C++/C语言的标准库函数,new/delete是C++的运算符,它们都可以动态申请和释放内存。
对于非内部数据类型(如ADT/UDT)的对象而言,使用malloc()与free()无法满足要求:对象创建自动调用构造函数,对象销毁自动调用析构函数。由于malloc()与free()是库函数不是运算符,不在编译器控制权限之内,因此C++语言使用new/delete。
函数malloc原型如下:
void *malloc(size_t size);
例如申请一块长度为n的整型数组的内存:
int *p = (int *)malloc(sizeof(int) * n);
函数free的原型如下:
void free(void * memblock);
new有3种使用方式:plain new、nothrow new、placement new。
new内置了sizeof、类型转换和类型安全检查功能,比使用malloc简单很多,例如。
int *p = (int *)malloc(sizeof(int) * n); int *p = new int[n]; Obj *o = new Obj; //使用默认构造函数构造对象 Obj *o = new Obj(1); //使用初值1构造对象 Obj *o = new Obj[100]; //如用new创建对象数组,只能使用默认构造函数 delete p; //释放一个对象 delete []o; //释放一个对象数组
(完)
标签:编译器 初始化 sizeof 结束 局部变量 内部数据 block 全局变量 c++语言
原文地址:http://www.cnblogs.com/alwayswangzi/p/6505558.html