在展示位置中输入新信息

时间:2014-05-02 22:55:47

标签: c++

我有一个新的操作符,可以预见,它会从池中分配内存。但是,我还需要知道对象类型来设置一些元字段。我可以将它作为第二个参数传递给new作为字符串,但是因为我在调用new时指定了类型,是不是有任何方法可以隐式得到它?

E.g。我能做到这一点:

void* operator new(size_t count, Pool* pool, const char* type)
{
  return pool->alloc(count, type); // type is used to associate metadata with the allocated chunk
}
Car* car = new(pool, "Car") Car(...);

但我不能做这样的事吗?

template<class T>
void* operator new(size_t count, Pool* pool)
{
  return pool->alloc(count, typeid(T).name());
}
Car* car = new(pool) Car(...);

1 个答案:

答案 0 :(得分:3)

不,抱歉。除了仅适用于您控制的类类型的成员分配器函数之外,C ++既不使用类类型来选择operator new函数,也不为operator new函数提供任何标准方法来确定调用的类型new-expression(如果有的话)。

你可以给你的Pool类一个模板成员函数来处理分配和构建:

template<typename T, typename... Args>
T* Pool::create(Args&& ... args) {
    void* ptr = alloc(count, typeid(T).name());
    try {
        return ::new(ptr) T(std::forward<Args>(args)...);
    } catch (...) {
        dealloc(ptr);
        throw;
    }
}

    // ...
    Car* car = pool->create<Car>(vroom);

(关于你可能已经知道的东西的其他评论:记住在类构造函数抛出异常的情况下实现匹配的placement-delete。考虑建立一个Allocator接口以与标准库兼容。)