3

有没有办法获得使用 operator new[] 分配的单个元素的大小或元素计数?

我的意思是说:

void* Object::operator new[](size_t size)
{
    void *temp = ::operator new(size);

    //Get size of single element or count of elements being allocated

    return temp;
}

为什么我需要它:

operator new(size_t)并且operator new[](size_t)仅当在堆上分配对象时才调用,所以我有了一个基于此创建 c++ 垃圾收集的想法。

  1. 所有对象都继承自Object
  2. Object类覆盖operator new(size_t)operator new[](size_t)像这样:

    void* Object::operator new(size_t size)
    {
        Object& result = *static_cast<Object*>(::operator new(size));
        result.referenceCount = (int)&result;
        return &result;
    }
    
  3. 构造函数Object使用此信息:

    Object::Object()
    {
        if ((void*)referenceCount != this)
        {
            referenceCount = -1; //stack object no reference counting
        }
        else
        {
            referenceCount = 1; //heap object count references
        }
    }
    
  4. 要使用的垃圾收集器用户referenceCount字段。

我现在需要的是实现operator new[](size_t)设置referenceCount,这就是为什么我需要单个元素的大小或元素计数。operator new[](size_t)对每一个对象都无能为力。

有任何想法吗?

4

1 回答 1

3

这对我来说似乎非常Java-esque。简单地用 Java 编写程序会更简单吗?如果您使用惯用的 C++ 开始,那么将来必须维护您的 C++ 代码的任何人都会喜欢它。例如,使用智能指针来管理您的内存,而不是尝试基于从Object.

我应该指出,您在条件列表中遗漏了“禁止多重继承”,因为在存在多重继承的情况下,您将原始的、未初始化的内存转换为Object*可能无法进行访问正确地址所需的指针调整referenceCount.

此外,如果内存referenceCount恰好在构造时保存了基于堆栈的地址,Object您的代码将认为它是堆分配的,并在您删除堆栈指针时最终导致 UB。

毕竟如果你真的真的很想这样做,我认为你唯一的选择是使用 CRTP 自动将数组 new 运算符注入每个子类。至少这样你就不必为每个孩子自己写。

于 2012-12-28T21:30:09.163 回答