您的位置:首页 > 编程语言 > C语言/C++

知识点1-2

2016-04-18 09:04 591 查看
本博客长期更新

1、int a = 0 and int a(0) 的区别

没有区别

参考两个网站 SO1SO2

2、new/delete和malloc/free的区别

相同点:均可用于申请动态内存和释放内存

不同点:

(1)操作对象不同

malloc/free是c++标准库函数,而new/delete是c++的运算符。对于非内部数据类的对象而言,仅仅使用malloc和free不能满足动态对象的要求。此外,对象在创建同时要自动执行构造函数,消亡时候要执行析构函数;由于malloc和free是库函数而不是运算符,无法把执行构造和析构函数任务强加于malloc和free身上。

(2)用法上不同

——-函数malloc的原型

void *malloc(size_t size)

用malloc申请长length的整形内存,程序如下

int p=(int )malloc(sizeof(int)*length);

有两点需注意:1、强制类型转换 2、sizeof

(一)void*表示未确定类型的指针,需要进行类型转换,讲void*转换成需要的指针类型

(二)malloc并不关心要申请的内存是什么类型,只关心长度是多少

——-函数free的原型

void free(void *memblock)

指针的类型及所指内存的容量事先知道,p是NULL,free(p)不会出错,如果不是NULL,连续free 两次会编译出错

——-函数new的原型

int*p=new int[length]

int p2=(int )malloc(sizeof(int)*length)

new内部覆盖了sizeof、类型转换和类型检查等问题。

对于非内部对象而言,new语句如下:

obj * object=new obj[100];

不能写成obj *object=new obj[100] (1);

——-函数delete

delete释放对象数组,不可遗漏[]

delete []object;// right

delete object;//wrong 还有99个没有清空

总结:

new自动分配空间,而malloc需要手动计算

new是安全的,malloc性能不高

int *p=new float[2];//编译时指出错误

int p2=(int)malloc(sizeof(float)*len);//无法指出错误

其实new操作分两步走,分别是operator new,再就是constructor

operator new对应malloc,但operator new可以重载,可以自定义内存分配策略,甚至不分配内存,而malloc不行

new将会调用constructor,malloc不能;delete将调用deconstructor,free不能

malloc/free需要库函数支持,new不需要。

例子:

class Obj{
public:
Obj()   {
cout << "Initialization1" << endl;
}
~Obj() {
cout << "Destroy1" << endl;
}
void Initialize()   {
cout << "Initialization2" << endl;
}
void  Destroy() {
cout << "Destroy2" << endl;
}
}obj;

void  UseMallocFree(){
Obj   * a = (Obj  *)malloc(sizeof(obj));      //  allocate memory
a->Initialize();                                    //  initialization
// …
a->Destroy();                                        // deconstruction
free(a);                                               // release memory
}

void  UseNewDelete(void){
Obj   * a2 = new  Obj;
// …
delete a2;
}

int main() {
UseMallocFree();
return 0;
}




如果main函数执行另外一个:

int main() {
UseNewDelete();
return 0;
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c-c++小知识点