在以下代码中:
#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?
答案 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。