New delete 与malloc free 的联系与区别

时间:2024-09-21 04:38:42 资料大全 我要投稿
  • 相关推荐

New delete 与malloc free 的联系与区别

  答案:都是在堆(heap)上进行动态的内存操作,

New delete 与malloc free 的联系与区别

。用malloc函数需要指定内存分配的字节数并且不能初始化对象,new 会自动调用对象的构造函数。delete 会调用对象的destructor,而free 不会调用对象的destructor.

  拓展:

  在 C++ 中,你也许经常使用 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 是什么玩意,

资料共享平台

New delete 与malloc free 的联系与区别》(https://www.unjs.com)。

  operator new 和 operator delete

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

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

  void *operator delete(void *); //free an object

  void *operator new[](size_t); //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 背后的机制:

  我们不用简单的 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 以及打开一个文件,析构函数关闭打开的文件。

  我们使用

【New delete 与malloc free 的联系与区别】相关文章:

劳动合同与就业协议书的区别联系10-31

一个标准的外商联系函格式03-13

第一志愿和平行志愿的区别03-28

平行志愿和非平行志愿的区别和对比06-15