c++ - C++适当覆盖new []和delete []

标签 c++ memory overloading

this库中,以下是newdeletenew[]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);
}
newdelete的替代对我来说很有意义。但是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[]
注意newnew[]operator newoperator new[]不同,前者是调用构造函数(也许在new[]的情况下,进行簿记以跟踪构造了多少个元素,我想这就是您提到的包装器)。 operator newoperator new[]的唯一责任是分配足够的内存。

关于c++ - C++适当覆盖new []和delete [],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63717615/

相关文章:

c++ - 是否需要冗余包含 guard ?

c - 可以在事务期间检查 WAL 文件吗?

java - Android 相机应用程序无法正确显示图像

c++ - 使用 std::tie 比较结构

java - 如何在java中从子级调用重写的函数?

c++ - 访问由 std::shared_ptr 包装的类的运算符重载

c++ - 为什么临时 'Test'没有移动,而只是构造?

c++ - 使用与 C++ 标准允许的成员变量相同的名称为构造函数参数初始化成员变量?

C++ 隐式转换 : Order of the conversions

php - PHP 实际使用了多少内存?