美文网首页
new AND delete

new AND delete

作者: charlieyan | 来源:发表于2018-01-05 10:28 被阅读0次

    转载自 new和detele
    和sizeof类似,new 和 delete也不是函数,比如new和c中的malloc函数不同的是,string *ps = new string("hello world");
    malloc申请完了之后不会对内存进行必要的初始化,但是new可以。

    operator new 和 operator delete

    这两个其实是 C++ 语言标准库的库函数,原型分别如下:

    void *operator new(size_t); //allocate an object
    void *operator delete(void *); //free an object

    void *operator new; //allocate an array
    void *operator delete[](void *); //free an array

    后面两个你可以先不看,后面再介绍。前面两个均是 C++ 标准库函数,你可能会觉得这是函数吗?请不要怀疑,这就是函数!C++ Primer 一书上说这不是重载 new 和 delete 表达式(如 operator= 就是重载 = 操作符),因为 new 和 delete 是不允许重载的。但我还没搞清楚为什么要用 operator new 和 operator delete 来命名,比较费解。我们只要知道它们的意思就可以了,这两个函数和 C 语言中的 malloc 和 free 函数有点像了,都是用来申请和释放内存的,并且 operator new 申请内存之后不对内存进行初始化,直接返回申请内存的指针。
    我们可以直接在我们的程序中使用这几个函数。

    new 和 delete背后的机制

    用一个实例来解释 new 和 delete 背后的机制:

    class A
    {
    public:
     A(int v) : var(v)
      {
        fopen_s(&file, "test", "r");
      }
      ~A()
      {
        fclose(file);
      }

    private:
      int var;
      FILE *file;
    };

    A类中有两个成员var file,一个构造函数一个析构函数,析构函数中初始化私有变量var以及打开一个文件,析构函数关闭打开的文件。
    使用语句

    class *pA = new A(10);

    来创建一个类的对象,返回其指针pA。new背后完成的工作包括:
    1.调用operator new标准库函数来分配足够大的原始的未类型化的内存
    2.运行该类型的相对应的构造函数。在上一步的内存基础上进行初始化对象。
    3.返回指向新分配并构造的对象的指针。

    申请和释放一个数组

    申请数组可以这样

    string &psa = new string[10];
    int *pia = new int[10];

    释放数组可以使用:

    delete [] psa
    delete [] pia

    在释放数组时[]不可以漏掉。

    相关文章

      网友评论

          本文标题:new AND delete

          本文链接:https://www.haomeiwen.com/subject/bsujnxtx.html