问题描述
在this库中,new
,delete
,new[]
和delete[]
有以下全局替代项:
/* ------------------------------------------------------------ */
/* ---------------------- new and delete ---------------------- */
/* ------------------------------------------------------------ */
/* ---------------------------------------- operator new */
void *operator new(size_t size)
{
void *p = MemTrack::TrackMalloc(size);
if (p == NULL) throw std::bad_alloc();
return p;
}
/* ---------------------------------------- operator delete */
void operator delete(void *p)
{
MemTrack::TrackFree(p);
}
/* ---------------------------------------- operator new[] */
void *operator new[](size_t size)
{
void *p = MemTrack::TrackMalloc(size);
if (p == NULL) throw std::bad_alloc();
return p;
}
/* ---------------------------------------- operator delete[] */
void operator delete[](void *p)
{
MemTrack::TrackFree(p);
}
new
和delete
的替代对我来说很有意义。但是new[]
和delete[]
呢?当使用new[]
创建新数组时,c ++中的AFAIK也会在指针之前存储元素的数量,以便delete[]
可以在元素上调用析构函数。覆盖new[]
和delete[]
时是否需要考虑这一点,或者是否存在某种隐式“包装器”将其添加到覆盖实现的所有分配之外?
如果没有,如何正确完成?似乎new[]
运算符也只获取应分配的字节数,而不是元素数。
解决方法
您的假设是错误的
使用new []创建新数组时,c ++中的AFAIK也会存储 元素数
C ++中没有任何内容说明必须如何实现new[]
。
请注意,new
和new[]
与operator new
和operator new[]
不同,前者的调用构造函数(在new[]
的情况下可能会做一些记账以跟踪构造了多少个元素,我想这就是您提到的包装器)。 operator new
和operator new[]
的唯一职责是分配足够的内存。
根据CPP reference,new[]
的标准库实现实际上调用new
:
- 由new []-expressions的数组形式调用以分配所有 数组所需的存储空间(包括可能的new表达式 高架)。标准库实现调用版本(1)
之所以有意义,是因为在两种情况下,size
的参数operator new
表示要分配的字节数,而忽略了对象数,这与该运算符无关。关心对象数量的运算符是operator []
。