Difference Between Malloc and New in C++
new and delete
- the way it allocate and release memory
- the memory is allocate from
Free Store
- will return a fully typed pointer
- if failed will not return NULL
- the compiler will calculate the size
- reallocate is not handled intuitively, using copy constructor
- whether called malloc and delete can be user defined
- can add a new memory allocator to deal with low memory
- new and delete can be overwrite legally
- use constructor/destructor to initial/destory object
- the memory is allocate from
new 动态创建和释放数组或者单个对象
- 动态创建对象的时候,只需要指定其数据类型,不必为该对象命名
- 如果分配失败了,会抛出异常。
- new 表达式返回指向该新建对象的指针
- 我们可以通过这个指针来访问新建的对象
- int *p = new int
- 返回类型为int*类型, 分配大小为sizeof(int)
- int *p = new int[100]
- 返回类型为int*类型, 分配大小为sizeof(int) * 100
三种特殊指针
- void* 表示未确定类型的指针,更明确的说是指申请内存空间时还不知道user是用来储存什么类型的数据的。
- 零值指针:值为0的指针。可以是任何一种指针类型。
- NULL指针:不提供任何地址信息的指针
new 动态创建的对象是可以初始化的。
- e.g int *p = new int(1000)
- 如果不初始化,就会使用这个类的默认构造函数来初始化。
- e.g int *p = new int() //初始化为0
- 但是如果对象是内置的,就没有初始化
- e.g int *p = new int //指向一个没有初始化的int
- string *str = new string() //初始化为空串,因为string自带的默认构造函数会初始化为空串
- e.g int *p = new int //指向一个没有初始化的int
delete
- delete p;
- 但是释放完p的内存之后,p会变成不确定的指针
- 因此要把p赋值为0
- 明确指针不再指向任何对象
- delete p;
malloc and free
the way it allocate and release memory
- the memory is allocate from
Heap
- will return a void pointer
- will return NULL if failed
- the space and size need to be specified(固定)
- will not called new/delete
- it is simple to reallocate large memory
- user can not write code into allocation sequence to help with low memory
- malloc/free can not be overriden legally
- the memory is allocate from
malloc 动态内存分配
- void *malloc(int size)
- 向系统申请分配指定size个字节的内存空间
- 申请之后要检查是否分配成功
- 不用之后要释放:把纸箱这块内存的指针指向NULL, 防止程序不小心使用了它
- 如果忘了释放就是内存泄露
- 操作系统中有一个记录空闲内存位置的链表,每次收到程序申请的时候,就会遍历这个链表,找到第一个空间大于申请的空间的堆节点,然后把该节点从链表中删除,把这个节点的空间分配给程序。
- int p;
- p = (int*)malloc(sizeof(int) * 128)
- p指针会存储存储单元的首地址