https://www.cnblogs.com/gatherstars/p/8179859.html
1. 数组的时候int *p=(int*)malloc(10*sizeof(int)) 释放的时候 free(p)即可;
这是因为编译器对malloc做了一些特殊的处理,以保证可以正确释放内存。
而当int *p=new int[10]释放的时候应为delete []p,注意[]的作用说明释放的是一个数组的内存,
如果delete p则只是释放的p[0],其余9个int的内存没有释放;这是因为当指明为[]的时候,
编译器实际上是做了一个循环来释放这个数组的所有内存。
2. 在类和对象的时候会有很大区别。在使用malloc和free来处理动态内存的时候,仅仅是释放了这个对象所占的内存,而不会调用这个对象的析构函数;使用new和delete就可以既释放对象的内存的同时,调用这个对象的析构函数。
https://www.cnblogs.com/wangpfcnblogs/p/4604311.html
一,new和delete:
(1)new是操作符,不是函数,malloc是函数。
(2)基本数据类型(int ,float,double,char),free, malloc, new,delete 效果一致。
(3)delete ,free对于基本数据类型,释放,释放两次都会出错。
(4)free之后,指针的值不会改变,delete之后,指针的值会改变(我的电脑上每次delete之后,指针的值变成了0000 8123),
而free之后的指针的值没有改变,打印出来的是垃圾值。free之后,为了避免迷途指针,
最好将指针设置为空指针(nullptr)。
(5)如果是基本数据类型 new 是不会调用构造函数,delete 时不会调用析构函数。
如果是结构类型,new会调用构造函数,delete会调用析构函数。
(6)基本数据类型 数组,delete,delete[]一致;基本数据类型,可以互相混合使用。
(7)复合数据类型(delete ,delete[]不能混合使用)
例如:mydata *p(new mydata); delete p;
mydata *p(new mydata[10]); delete[] p;
(8)单个堆上的对象,不可以用delete [],反复delete,下面delet代码是错误,只用能delete p,不能用delete [] p.
mydata *p(new mydata);
delete [ ] p;//单个堆上的对象,不可以用 delete [],用delete[]程序会报错
#include<iostream>
using namespace std;
void main2()
{
int *p1 = new int(4);//指向一个变量
int *p2 = new int[10]{ 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };//指向数组
delete p1;//delete p1 int *p1 = new int(4);
delete[] p2;//delete[] p2 int *p2 = new int[10]{ 1,2,3,4,5,6,7,8,9,0 };
cin.get();
}
网友评论