c/c++语言开发共享最新C/C++中的new和delete的实现过程小结

下面是《c++ primer 5th》中p726 对 new 和 delete 过程的解释:当我们使用一条new表达式时,实际上执行了三步操作:new表达式调用一个名为 operator new (或

下面是《c++ primer 5th》中p726 对 new 和 delete 过程的解释:

当我们使用一条new表达式时,实际上执行了三步操作:

  • new表达式调用一个名为 operator new (或者 operator new[] )的标准库函数。该函数分配一块足够大的、原始的、未命名的内存空间以便存储特定类型的对象(或者对象数组)。
  • 编译器运行相应的构造函数以构造这些对象,并为其传入初始值。
  • 对象被分配了空间并构造完成,返回一个指向该对象的指针。

当我们使用一条delete表达式时,实际上执行了两步操作:

  • 对sp所指的对象或者arr所指的数组中的元素执行相应的析构函数。
  • 编译器调用名为 operator delete (或者 **operator delete[] **)的标准库函数释放内存空间。

由于不同编译器对new的实现过程不同,所以我们下面以侯捷老师课件来进行详解。

new

假设我们现在有一个类:complex.h

#ifndef __mycomplex__  #define __mycomplex__    class complex {  public:  	complex(double r = 0, double i = 0) :m_real(r), m_imag(i) {}  	double real() const { return m_real; }  	double imag() const { return m_real; }    private:  	double m_real;  	double m_imag;  };    #endif  

我们new一个对象

complex* pc = new complex(1,2);//complex为类名(复数)  

编译器处理new这一语句的时候,先分配复数的内存,然后进行转型,最后调用构造函数,进行了下面三个过程

void* men= operator new( sizeof(complex));//第一步,分配内存  pc = static_cast<complex*>(men);//第二步,转型  pc->complex :: complex(1,2);//第三步,调用构造函数  

下面是在vs2019上反汇编得到:

最新C/C++中的new和delete的实现过程小结

整体示意图如下:

最新C/C++中的new和delete的实现过程小结

delete

当我们进行 delete 操作时:

delete pc;

在编译器的处理过程中,这一语句转化两个步骤:先析构再free

complex::~complex(pc);//析构函数  operator delete(pc);//释放内存  

下面是在vs2019上反汇编得到:

最新C/C++中的new和delete的实现过程小结

示意图如下:

最新C/C++中的new和delete的实现过程小结

整体代码如下:

int main() {  	complex* pc = new complex(1, 2);  	cout << pc->imag() << ":" << pc->real() << endl;  	delete pc;  	system("pause");  	return 0;  }  

整体程序运行结果如下:

最新C/C++中的new和delete的实现过程小结

new[]

假设我们有一个类 mystring.h

#ifndef __mystring__  #define __mystring__    #include <string>    class mystring {  public:  	mystring(const char* cstr = 0) {          if (cstr) {              m_data = new char[strlen(cstr) + 1];              strcpy(m_data, cstr);          }          else {              m_data = new char[1];              *m_data = '';          }  	}      ~mystring() {          delete[] m_data;      }      char* get_c_str() const { return m_data; }  private:      char* m_data;  };    #endif  

我们new一个对象

mystring* ps = new mystring("hello");

编译器处理new这一语句的时候,也是分为三个过程,与上相同

void* men= operator new( sizeof(mystring));//第一步,分配内存  ps = static_cast<mystring*>(men);//第二步,转型  ps->mystring:: mystring("hello");//第三步,调用构造函数

下面是在vs2019上反汇编得到:

最新C/C++中的new和delete的实现过程小结

示意图如下:

最新C/C++中的new和delete的实现过程小结

delete[]

当我们进行 delete 操作时:

delete ps;

在编译器的处理过程中,这一语句转化两个步骤:先析构再free

mystring::~mystring(ps);//析构函数  operator delete(ps);//释放内存

下面是在vs2019上反汇编得到:

最新C/C++中的new和delete的实现过程小结

最新C/C++中的new和delete的实现过程小结

示意图如下:

最新C/C++中的new和delete的实现过程小结

整体代码如下:

int main() {    	mystring* ps = new mystring("hello");    	cout << ps->get_c_str() << endl;    	delete ps;    	system("pause");  	return 0;  }

整体程序运行结果如下:

最新C/C++中的new和delete的实现过程小结

到此这篇关于c/c++中的new和delete的实现过程的文章就介绍到这了,更多相关c++ new和delete内容请搜索<计算机技术网(www.ctvol.com)!!>以前的文章或继续浏览下面的相关文章希望大家以后多多支持<计算机技术网(www.ctvol.com)!!>!

需要了解更多c/c++开发分享最新C/C++中的new和delete的实现过程小结,都可以关注C/C++技术分享栏目—计算机技术网(www.ctvol.com)!

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/c-cdevelopment/1237519.html

(0)
上一篇 2022年9月8日
下一篇 2022年9月8日

精彩推荐