new/delete

来自:https://www.cnblogs.com/xuelisheng/p/9339957.html

new:

  • 简单类型(包括基本数据类型和不需要构造函数的类型)直接调用operator new分配内存;
  • 复杂数据类型的时候先调用operator new,然后在分配的内存上调用构造函数。

delete:

  • 简单数据类型(包括基本数据类型和不需要析构函数的类型)默认只是调用free函数。
  • 复杂数据类型(需要由析构函数销毁对象)先调用析构函数再调用operator delete。
3、new 数组
new[]也分为两种情况:
(1) 简单数据类型(包括基本数据类型和不需要析构函数的类型)
  针对简单类型,new[]计算好大小后调用operator new。
(2)复杂数据类型(需要由析构函数销毁对象)
  针对复杂类型,new[]会额外存储数组大小。
 
4、delete 数组
delete[]也分为两种情况:
(1) 简单数据类型(包括基本数据类型和不需要析构函数的类型)
  针对简单类型,delete和delete[]等同。
(2)复杂数据类型(需要由析构函数销毁对象)
  针对复杂类型,new[]出来的内存只能由delete[]释放。
 
//转载:https://www.cnblogs.com/fudong071234/p/7244983.html
Q:delete是如何知道要释放的内存的大小的

内存分配一般有两种方式: 
1 非入侵式,内存分配器自行先申请内存(和栈配合使用),用作记录用户层的申请记录(地址,大小)。 用户释放空间时会查找该表,除了知道释放空间大小外还能判断该指针是合法。

2 入侵式,例如用户要申请1byte的内存,而内存分配器会分配5byte的空间(32位),前面4byte用于申请的大小。释放内存时会先向前偏移4个byte找到申请大小,再进行释放。
两种方法各有优缺点,第一种安全,但慢。第二种快但对程序员的指针控制能力要求更高,稍有不慎越界了会对空间信息做成破坏。

绝大多数的分配器会采用第一种方式实现,而操作系统级的分配器采用了虚拟等方式,可能要记录更多信息。

Q:delete[]如何知道需要调用析构函数次数

A:C++ 的做法是在分配数组空间时多分配了 4 个字节的大小,专门保存数组的大小,在 delete [] 时就可以取出这个保存的数,就知道了需要调用析构函数多少次了。

 返回 C++学习笔记
 
 
 
 
原文地址:https://www.cnblogs.com/Toya/p/9603053.html