重载new和delete操作符

Overloading new and delete operator

本文关键字:操作符 delete new 重载      更新时间:2023-10-16

在以下代码中:

#include <cstdio>
#include <cstdlib>
using namespace std;
void* operator new(size_t sz)    
{
   printf("operator new: %d Bytesn", sz);  //LINE0
   void* m = malloc(sz);
   if(!m) puts("out of memory");
   return m;
}
void operator delete(void* m) {
   puts("operator delete");
   free(m);
}
class S {
    int i[100];
public:
    S() { puts("S::S()"); }
   ~S() { puts("S::~S()"); }
};
int main() {
  puts("creating & destroying an int");
  int* p = new int(47);   //LINE1
  delete p;
  puts("creating & destroying an s");
  S* s = new S;           //LINE2
  delete s;
  puts("creating & destroying S[3]");
  S* sa = new S[3];
  delete []sa;
} 
下面是代码的输出: <>之前创建和销毁int类型operator new: 4字节运营商删除创建和销毁一个soperator new: 400字节S::年代()S:: ~ ()运营商删除创造和摧毁S[3]operator new: 1208字节S::年代()S::年代()S::年代()S:: ~ ()S:: ~ ()S:: ~ ()运营商删除之前

LINE1将参数"47"传递给操作符new。为什么在LINE0处,它变成了4字节?LINE2没有传递size参数给new操作符。为什么在LINE0处打印的sz变成了400 ?

让我们先分析一下你的一些代码。

  • int(47)创建一个为47的整数。
  • operator new(size)只是分配size字节来使用,并返回指向新内存空间的指针

当你调用new int(47)时,你是隐式地调用operator new(sizeof(int))->int(47) -这意味着,由于输出是4, int在你的系统上是4个字节。

同样,当你调用new S时,你隐式地调用了operator new(sizeof(S))->S()。由于S包含100个int,而每个int在您的平台上是4个字节,现在可以推断出sizeof(S)将是400,这解释了您的输出。

你理解错了。你的LINE1"传递47到operator new"。相反,它将sizeof(int)传递给operator new,然后在该内存中创建一个值为47的整数。

同样,LINE2处的代码用sizeof(S)调用operator new


如果你喜欢这个类比,语句T * p = new T(a, b, c);大致相当于:

void * addr = operator new(sizeof(T));   // or T::operator new if available
T * p = new (addr) T(a, b, c);           // placement-new

在这个类比中,delete p;具有以下效果:

p->~T();
operator delete(addr);

为什么在LINE0处变成4 Bytes

,因为int的大小在这台机器上是4字节。这个整数的实际值,47并不重要,将为任何整数值分配相同大小的4字节。值47用于初始化已分配的内存。

LINE2 does not pass a size argument to the operator new(...)

类S的大小对编译器是可见的,它作为operator new的第一个参数隐式传递。它是400,因为数组

int i[100];

包含100个整数。

LINE1 "int* p = new int(47)"分配1个int元素,即4字节。47是分配的int元素的初始值。如果你想分配一个数组,你应该执行"int *p = new int[47]",而删除命令应该是"delete[] p"。

LINE2分配1个S对象。因为S对象包含一个包含100个元素的int数组,所以它的大小是100 * 4 = 400。