0
点赞
收藏
分享

微信扫一扫

C++学习5——new&&delete

吴wuwu 2022-01-20 阅读 154
  • new(可以通过指针访问)

    • new int;(分配空间)

    • new Stash(类);(先分配空间,再调用构造函数)

    • new int[10];

  • delete

    • delete p;(delete 这个对象,先析构,再收回空间)

    • delete[] p;

int * psome=new int [10];//有多个数据
delete [] psome;
//如果使用不带[]的delete,psome只有第一个数据被delete
int *p=new int;
int *a=new int[10];

Student *q=new Student();
Student *r=new Student[10];
//曾经new的空间都会有记录

delete p;//查找p的地址,收回p的空间,并抹去记录

a++;
delete[] a;//a++后,a的地址改变,与记录不符合,delete查找不到a的地址,会报错

delete q;//首先调用析构(原因:根据q的类型,调用Student的析构),然后通过记录查找比对,收回空间

delete r;//调用r所指的对象的析构,只析构了一个,但是空间都收回了

delete[] r;//加上[],知道是多个数据,将所有数据都析构完,再收回空间
#include<iostream>
using namespace std;

class A{
private:
    int i;
    int *p;    
public:
    A(){p=0; i=0;cout<<"A::A()"<<endl;}
    ~A(){if(p) delete p;cout<<"A::~A(),i="<<i<<endl;}//p可以是new的,也可能不是,需要写delete,if(p)可以不写,最好写一下,就算不是new的,也可以delete
    //void set(int i){i=i;}根据就近原则,本局中屏蔽了成员变量i,所以需改成以下句子:
    void set(int i){this->i=i;}
    void f(){p=new int;}
/*  A(){p=new int;i=0;cout<<"A::A()"<<endl;}
    ~A(){delete p;cout<<"A::~A(),i="<<i<<endl;}*/
};
int main()
{
    A* p=new A[10];
    for(int i=0;i<10;i++){
        p[i].set(i);
    }
    delete[] p;
    return 0;
}

运行结果:

delete[]是与new反过来的。

如果申请的内存,没有delete,可能会造成内存泄漏。

举报

相关推荐

0 条评论