重载new和delete操作符
Overloading new and delete operator
在以下代码中:
#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。
- 如果操作符delete没有实现,为什么不编译它
- 提升ipc new和delete操作符
- 当delete操作符释放内存时,我为什么需要析构函数
- 当操作符delete()在汇编中删除vptr指针时
- 为特定类重写new和delete操作符的原因是什么?
- 使用delete操作符删除void指针
- 关于操作符new()和操作符delete()的问题
- c++是delete操作符重写内存
- New和delete操作符不影响指向该类的指针的Deque的内容
- 涉及数组指针时delete[]操作符的问题
- 当构造函数抛出异常时,Delete操作符出现分段错误
- delete[]操作符是否适用于通过指针返回的动态分配的内存?
- 如何重载操作符new和delete来跟踪内存
- 何时调用delete操作符
- 为什么要替换默认的new和delete操作符
- 重载new和delete操作符
- c++的new和delete操作符重载
- 编译不带delete操作符的c++
- dylib中的重载操作符delete取代OSX中的系统操作符
- 关于Struct上的new和delete操作符