在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[]
运算符也只获取应分配的字节数,而不是元素数。
最佳答案
你的假设是错误的
AFAIK in c++ when a new array is created using new[], it also stores the number of elements
C++中没有任何内容说明必须如何实现
new[]
。注意
new
和new[]
与operator new
和operator new[]
不同,前者是调用构造函数(也许在new[]
的情况下,进行簿记以跟踪构造了多少个元素,我想这就是您提到的包装器)。 operator new
和operator new[]
的唯一责任是分配足够的内存。
关于c++ - C++适当覆盖new []和delete [],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63717615/