C++ 中的创建和删除数组(new/delete 和 new[]/delete[]) |
您所在的位置:网站首页 › 人工分页符可以用delete删除吗 › C++ 中的创建和删除数组(new/delete 和 new[]/delete[]) |
C++ 中的创建和删除数组(new/delete 和 new[]/delete[])
已有 4122 次阅读 2017-4-17 16:33|个人分类:C++|系统分类:科研笔记|关键词:C++,数组,动态数组|数组, 动态数组 在 C++ 中,我们也许经常使用需要建立数组和释放内存的问题,在动态分配内存的时候一般有两种方式,一个是malloc和new两种形式。 比如使用malloc的时候,一般形式如下: har *Ptr = NULL;Ptr = (char *)malloc(100 * sizeof(char));if (NULL == Ptr){exit (1);}gets(Ptr);free(Ptr); 在使用new的时候,一般的形式如下: 1. 删除单变量地址空间 int *a = new int; delete a; //释放单个int的空间2. 删除数组空间 int *a = new int[5]; delete []a; //释放int数组空间 new 和 delete 来动态申请和释放内存,但你可曾想过以下问题呢? new 和 delete 是函数吗? new [] 和 delete [] 又是什么?什么时候用它们? 你知道 operator new 和 operator delete 吗? 为什么 new [] 出来的数组有时可以用 delete 释放有时又不行?如果你对这些问题都有疑问的话,不妨看看我这篇文章。new 和 delete 到底是什么?如果找工作的同学看一些面试的书,我相信都会遇到这样的题:sizeof 不是函数,然后举出一堆的理由来证明 sizeof 不是函数。在这里,和 sizeof 类似,new 和 delete 也不是函数,它们都是 C++ 定义的关键字,通过特定的语法可以组成表达式。和 sizeof 不同的是,sizeof 在编译时候就可以确定其返回值,new 和 delete 背后的机制则比较复杂。继续往下之前,请你想想你认为 new 应该要做些什么?也许你第一反应是,new 不就和 C 语言中的 malloc 函数一样嘛,就用来动态申请空间的。你答对了一半,看看下面语句:string *ps = new string("hello world");你就可以看出 new 和 malloc 还是有点不同的,malloc 申请完空间之后不会对内存进行必要的初始化,而 new 可以。所以 new expression 背后要做的事情不是你想象的那么简单。在我用实例来解释 new 背后的机制之前,你需要知道 operator new 和 operator delete 是什么玩意。operator new 和 operator delete这两个其实是 C++ 语言标准库的库函数,原型分别如下:void *operator new(size_t); //allocate an objectvoid *operator delete(void *); //free an objectvoid *operator new[](size_t); //allocate an arrayvoid *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 背后的机制:我们不用简单的 C++ 内置类型来举例,使用复杂一点的类类型,定义一个类 A:class A{public: A(int v) : var(v) { fopen_s(&file, "test", "r"); } ~A() { fclose(file); }private: int var; FILE *file;};很简单,类 A 中有两个私有成员,有一个构造函数和一个析构函数,构造函数中初始化私有变量 var 以及打开一个文件,析构函数关闭打开的文件。我们使用class *pA = new A(10);来创建一个类的对象,返回其指针 pA。如下图所示 new 背后完成的工作: 参考网址:http://blog.csdn.net/hazir/article/details/21413833#t0 |
今日新闻 |
点击排行 |
|
推荐新闻 |
图片新闻 |
|
专题文章 |
CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭 |