重载new和delete运算符

时间:2014-05-28 21:00:14

标签: c++

在以下代码中:

#include <cstdio>
#include <cstdlib>
using namespace std;

void* operator new(size_t sz)    
{
   printf("operator new: %d Bytes\n", 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;
} 

以下是代码的输出:

creating & destroying an int
operator new: 4 Bytes
operator delete
creating & destroying an s
operator new: 400 Bytes
S::S()
S::~S()
operator delete
creating & destroying S[3]
operator new: 1208 Bytes
    S::S()
    S::S()
    S::S()
    S::~S()
    S::~S()
    S::~S()
    operator delete

LINE1传递参数&#34; 47&#34;给操作员新的。为什么在LINE0,它变成4字节? LINE2不会将size参数传递给operator new。为什么在LINE0打印时sz变为400?

4 个答案:

答案 0 :(得分:1)

你不明白这一点。您的LINE1 &#34;将47传递给operator new&#34;。相反,它将sizeof(int)传递给operator new,然后在该内存中创建一个值为47的整数。

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


如果你喜欢这个比喻,那么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);

答案 1 :(得分:1)

让我们先解析一些代码。

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

当您拨打new int(47)时,您隐式地调用operator new(sizeof(int))->int(47) - 这意味着,因为输出为4,{ {1}}是您系统上的4个字节。

同样,当您致电int时,您会隐式调用new S。由于operator new(sizeof(S))->S()包含100个S,并且每个int在您的平台上为4个字节,因此您现在可以推断出int将为400,这说明你的输出。

答案 2 :(得分:0)

  

为什么在LINE0,它变为4字节

因为int的大小在这台机器上是4个字节。这个整数的实际值,47无所谓,相同大小的4个字节将被分配给任何整数值。值47用于初始化分配的内存。

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

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

int i[100];

包含100个整数。

答案 3 :(得分:0)

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

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