本文共 1656 字,大约阅读时间需要 5 分钟。
1 #include2 #include 3 #include 4 5 int main(){ 6 7 int *a =new int[100]; 8 for(int i=0;i<100;i++){a[i]=i;} 9 char *b;10 delete []a;11 for(int i=0;i<1000000;i++){12 b=new char [100];13 b="dfdf";}14 15 for(int i=0;i<100;i++){cout< <
所以不要这样
1 #include2 #include 3 #include 4 using namespace std; 5 class Cbox{ 6 char * aa; 7 public: 8 int g ; 9 Cbox(const char *a){int length =(strlen(a)+1);10 aa= new char[length +1];11 strcpy(aa,a);12 cout<<"gouzao"<
因为这里实参是通过传值方式传递的,会用默认构造函数创建实参的副本,副本的指针跟实参的指针指向空闲存储器中同一个字符串。 超出函数作用域后,副本会析构,使副本里 的指针 指向的内存被释放。 但实参还是指着那个位置,所以可能出错。
malloc/new/new[] 申请了一块内存的时候,编译器实际上会在这块内存的头部保存一个 size_t 信息,记录了这块内存的大小。这个size信息是需要占用额外的空间的
在对 p指针进行free/delete/delete []操作的时候,实际上会先通过 *(p-sizeof(size_t))
来获得这块内存的大小,然后将内存归还给系统。
如果是内置类型 int char 用delete 和delete[]没区别
如果是类类型 有析构函数那些就有区别了。 delete只会对第一个对象调用析构函数,然后释放掉这一整块内存的空间(包括那些没执行析构函数的对象。(第二个第三个。。。。))
delete[]则会对每个对象都执行析构函数,然后释放掉这一整块内存的空间。
对于下面的两行代码:
Base * p = new Derived();delete p;
如果derived有虚析构函数,那么deletep会调用虚析构函数
Base * p = new Derived[10];delete [] p;
但当用数组时这里就有问题了,会出现内存访问错误。原因在于在执行 delete [] p的时候,实际上是这么执行的:
for (int i = 0; i < memory_size; i = i + sizeof(Base)) { (Base *)((void * ) p + i)->~();}free(p);
在对数组中第一个对象执行析构函数的时候,结果是正常的;但是在对第二个对象执行析构函数的时候,由于Base对象和Derived对象的大小并不相同,(Base *)((void * ) p + i)
并不能找到虚表的地址——这个指针实际指向的并不是第二个Derived对象的开头,而是第一个Derived对象结尾的几个字节!程序会错误地把这末尾的几个字节的内容当做虚表的地址,所以会引发内存访问错误。
转载地址:https://www.cnblogs.com/l2017/p/6915315.html 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!