知识点1-2
2016-04-18 09:04
591 查看
本博客长期更新
1、int a = 0 and int a(0) 的区别
没有区别
参考两个网站 SO1,SO2
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不需要。
例子:
如果main函数执行另外一个:
1、int a = 0 and int a(0) 的区别
没有区别
参考两个网站 SO1,SO2
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语言编程优化运行速度
- 【Leetcode】8.String to Integer (atoi) 解题
- C/C++系列之如何实现一个avi格式的播放器
- c/c++实现浏览器的下载功能
- C++输出全排列递归算法详细解释
- VC++ WIN32 sdk实现按钮自绘详解.
- VC++ WIN32 sdk实现按钮自绘详解 之二(关键是BS_OWNERDRAW和WM_DRAWITEM)
- C++之多态
- c/c++返回值为指针、引用时注意的地方
- C++中的虚函数(virtual function)
- C++多线程
- OC和C语言的混编注意点和好处
- 关于C语言一些不起眼的小错误
- Effective C++: std::enable_shared_from_this
- C++中的virtual
- C++继承
- RSA算法详解及C语言实现
- C语言宏连接##问题
- C++中extern “C”含义深层探索
- C++使用事件对象实现多线程